用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Ntizar/MasterMind --skill solar-shadows-web-workers命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | solar-shadows-web-workers |
| description | Patrón de cálculo de sombras solares con Web Workers + Comlink para no bloquear la UI |
| version | 1.1.0 |
| created | 2026-06-01T00:00:00.000Z |
| updated | 2026-09-16T00:00:00.000Z |
| source | Ntizar/solmad |
| status | active |
| tags | ["data-science","solar","sombras","web-workers","solmad"] |
Proyecto origen: SolMAD (Ntizar/solmad)
Clusters: web-workers, calculo-solar, rendimiento-ui
Decay: lento
Patrón para realizar cálculos intensivos de sombras solares sin bloquear el hilo principal de la UI, usando Web Workers + Comlink para una API type-safe.
npm install comlink suncalc
src/workers/shadows.worker.ts)import * as Comlink from 'comlink';
import SunCalc from 'suncalc';
class SegIndex {
cell = 60; // metros por celda
grid = new Map<string, Seg[]>();
build(buildings, originLng, originLat) {
// Indexar segmentos de fachada en grid espacial
}
forEachAlongRay(ox, oy, dx, dy, len, fn) {
// Raycasting optimizado con grid spatial
// Usa visitToken para evitar Set (más rápido)
}
}
src/workers/shadowsClient.ts)import * as Comlink from 'comlink';
const workerUrl = new URL('./shadows.worker.ts', import.meta.url);
const worker = new Worker(workerUrl, { type: 'module' });
export const workerApi = Comlink.wrap<ShadowWorker>(worker);
Comlink.release(workerApi);
import { workerApi } from './workers/shadowsClient';
await workerApi.build(buildings, centerLng, centerLat);
const result = await workerApi.checkShadow(terraceLng, terraceLat, date);
Comlink.release() cuando el componente se desmonte"suncalc": "^1.9.0") viene desde sur (0=S) → convertir con (azFromSouth + 180 + 360) % 360; en v2 ya viene en grados clockwise desde el NORTE (0=N) → usar directo, NO aplicar la conversión o se gira 180° (sombras calculating en dirección opuesta). Ver ## SunCalc v2 abajo.visitToken en vez de Set para marcar segmentos visitados (evita alloc)Aprendido del repo mourner/suncalc (3.471⭐, BSD-2, activo). v2 es una reescritura de precisión: posición solar ~0.43°→~0.08°, salidas/puestas ~75s→~15s, posición lunar ~1.2°→~0.09° (validado contra JPL Horizons y USNO, fórmulas de Jean Meeus).
Breaking changes (migración SolMAD/shademap u otros proyectos con suncalc@1.x):
import * as SunCalc from 'suncalc' (ya no default import SunCalc). Sigue hay build UMD/CJS para <script> (global SunCalc) y require() — jsDelivr: https://cdn.jsdelivr.net/npm/suncalc/+esm (módulo) o /npm/suncalc (bundle global).(az+180)%360 (ver pitfall arriba).getTimes resuelve el día solar de la fecha pase la hora que pase (en v1 había que pasar el mediodía para evitar off-by-one). Para MOSTRAR en zona: toLocaleString/Intl con timeZone explícito (el DST se aplica solo).null (no Invalid Date) + flags alwaysUp/alwaysDown en latitudes polares. En zonas templadas como Madrid no dispara, pero el código que hace isNaN(date) debe pasar a === null.getMoonTimes escanea el día UTC; eliminado el argumento inUTC — para ventana civil local, pasar fecha a medianoche local. getMoonIllumination añade flag waxing.Para el raytraceo de sombras (uso en este patrón): getPosition(date, lat, lng) → {altitude, azimuth} en grados; el check "hay sol" sigue siendo altitude > obstrucción; el vector de dirección del rayo se construye YA desde norte (sin el +180). Precisión de ~15s hace innecesario el truco v1 de muestrear a mediodía.
src/workers/shadows.worker.ts (~14KB)src/lib/sun.ts — utilidad de conversión de azimut