// MapaBase: o mapa da cidade desenhado pelo kit (rio, parques, quadras, ruas brancas, avenidas amarelas, nomes de rua), // numa janela de 880 px com borda branca. A câmera do mapa anda por chaves `foco` [quadro, cx, cy, zoom, giro]; os pinos, as // rotas e os chips entram por props e ficam do mesmo tamanho na tela, qualquer que seja o zoom. Herói das cenas de mapa. import React from 'react'; import {useCurrentFrame} from 'remotion'; import {COR, MONO, MapaCtx, chavesN, e5, ov, seg} from '../base'; import {PinoGrupo, PinoProps} from '../formas/Pino'; import {RotaGrupo, RotaAnimadaProps} from '../formas/RotaAnimada'; import {ChipGrupo, ChipTempoProps} from '../formas/ChipTempo'; export type MapaBaseProps = { /** chaves da câmera: [quadro, cx, cy, zoom, giro°] em coordenadas do mapa (2000 × 2400); zoom 1 mostra o mapa quase todo */ foco: number[][]; pinos?: PinoProps[]; rotas?: RotaAnimadaProps[]; chips?: ChipTempoProps[]; inicio?: number; /** centro vertical da janela, px */ y: number; altura?: number; fim?: number; }; const W = 2000, H = 2400, JW = 880; const VERT = Array.from({length: 8}, (_, k) => 150 + k * 260), HORZ = Array.from({length: 9}, (_, j) => 120 + j * 240); const NOMES = [['Av. das Flores', 150, 1330, 0], ['R. do Sol', 150 + 260 * 3 - 30, 520, 90], ['R. da Lagoa', 700, 1090, 0], ['Av. Central', 1560, 1900, 90]] as const; const Cidade: React.FC = React.memo(() => {VERT.slice(0, -1).flatMap((x, k) => HORZ.slice(0, -1).map((y, j) => ((k * 7 + j * 3) % 5 === 0) ? null : ))} {[[1180, 1860], [1300, 1980], [1380, 1790], [310, 1930], [410, 2030], [1620, 300], [1700, 400]].map(([x, y], i) => )} {[...VERT.map((x) => ({x1: x, y1: -200, x2: x, y2: H + 200})), ...HORZ.map((y) => ({x1: -200, y1: y, x2: W + 200, y2: y}))].map((l, i) => )} {[...VERT.map((x) => ({x1: x, y1: -200, x2: x, y2: H + 200, a: false})), ...HORZ.map((y) => ({x1: -200, y1: y, x2: W + 200, y2: y, a: false}))].map((l, i) => )} {[1330, 1090].map((y) => )} {[1330, 1090].map((y) => )} {NOMES.map(([n, x, y, r]) => {n})} ); export const MapaBase: React.FC = ({foco, pinos = [], rotas = [], chips = [], inicio = 0, y, altura = 1100, fim = 1e9}) => { const f = useCurrentFrame(); if (f < inicio - 1 || f > fim + 14) return null; const t = ov(seg(f, inicio, inicio + 18)), sai = e5(seg(f, fim, fim + 12)); const [cx, cy, z, giro = 0] = chavesN(f - inicio, foco); const s = 0.5 * z; return
{rotas.map((r, i) => )} {pinos.map((p, i) => )} {chips.map((c, i) => )}
; };