diff --git a/public/css/style.css b/public/css/style.css index df05536..690b5a1 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -4980,7 +4980,7 @@ body.sternenhimmel-page #tooltip { transition: opacity 0.12s; z-index: 20; line-height: 1.65; - max-width: 215px; + max-width: 240px; } body.sternenhimmel-page #tooltip.visible { opacity: 1; } body.sternenhimmel-page #tooltip .tt-name { @@ -5001,6 +5001,19 @@ body.sternenhimmel-page #tooltip .tt-messier-sc { color: #c4b5fd; } body.sternenhimmel-page #tooltip .tt-messier-pn { color: #67e8f9; } body.sternenhimmel-page #tooltip .tt-messier-gx { color: #fcd34d; } body.sternenhimmel-page #tooltip .tt-messier-as { color: #d1d5db; } +body.sternenhimmel-page #tooltip .tt-media { + margin: 6px 0 8px; + border: 1px solid rgba(74, 158, 255, 0.18); + background: rgba(6, 14, 24, 0.88); + overflow: hidden; + } +body.sternenhimmel-page #tooltip .tt-image { + display: block; + width: 100%; + aspect-ratio: 1.4 / 1; + object-fit: cover; + background: rgba(2, 6, 12, 0.95); + } body.sternenhimmel-page .star-popup-fallback { position: fixed; diff --git a/public/images/messier/m1.png b/public/images/messier/m1.png new file mode 100644 index 0000000..148200d Binary files /dev/null and b/public/images/messier/m1.png differ diff --git a/public/images/messier/m10.png b/public/images/messier/m10.png new file mode 100644 index 0000000..ee19d5e Binary files /dev/null and b/public/images/messier/m10.png differ diff --git a/public/images/messier/m100.png b/public/images/messier/m100.png new file mode 100644 index 0000000..a926431 Binary files /dev/null and b/public/images/messier/m100.png differ diff --git a/public/images/messier/m101.png b/public/images/messier/m101.png new file mode 100644 index 0000000..05de31d Binary files /dev/null and b/public/images/messier/m101.png differ diff --git a/public/images/messier/m102.png b/public/images/messier/m102.png new file mode 100644 index 0000000..20de1a0 Binary files /dev/null and b/public/images/messier/m102.png differ diff --git a/public/images/messier/m103.png b/public/images/messier/m103.png new file mode 100644 index 0000000..837b420 Binary files /dev/null and b/public/images/messier/m103.png differ diff --git a/public/images/messier/m104.png b/public/images/messier/m104.png new file mode 100644 index 0000000..972589b Binary files /dev/null and b/public/images/messier/m104.png differ diff --git a/public/images/messier/m105.png b/public/images/messier/m105.png new file mode 100644 index 0000000..b20bc2b Binary files /dev/null and b/public/images/messier/m105.png differ diff --git a/public/images/messier/m106.png b/public/images/messier/m106.png new file mode 100644 index 0000000..1adb02a Binary files /dev/null and b/public/images/messier/m106.png differ diff --git a/public/images/messier/m107.png b/public/images/messier/m107.png new file mode 100644 index 0000000..80d4956 Binary files /dev/null and b/public/images/messier/m107.png differ diff --git a/public/images/messier/m108.png b/public/images/messier/m108.png new file mode 100644 index 0000000..971bc12 Binary files /dev/null and b/public/images/messier/m108.png differ diff --git a/public/images/messier/m109.png b/public/images/messier/m109.png new file mode 100644 index 0000000..2b05150 Binary files /dev/null and b/public/images/messier/m109.png differ diff --git a/public/images/messier/m11.png b/public/images/messier/m11.png new file mode 100644 index 0000000..755067e Binary files /dev/null and b/public/images/messier/m11.png differ diff --git a/public/images/messier/m12.png b/public/images/messier/m12.png new file mode 100644 index 0000000..19b4fa6 Binary files /dev/null and b/public/images/messier/m12.png differ diff --git a/public/images/messier/m13.png b/public/images/messier/m13.png new file mode 100644 index 0000000..7db73a4 Binary files /dev/null and b/public/images/messier/m13.png differ diff --git a/public/images/messier/m14.png b/public/images/messier/m14.png new file mode 100644 index 0000000..a258783 Binary files /dev/null and b/public/images/messier/m14.png differ diff --git a/public/images/messier/m15.png b/public/images/messier/m15.png new file mode 100644 index 0000000..954f914 Binary files /dev/null and b/public/images/messier/m15.png differ diff --git a/public/images/messier/m16.png b/public/images/messier/m16.png new file mode 100644 index 0000000..c681b92 Binary files /dev/null and b/public/images/messier/m16.png differ diff --git a/public/images/messier/m17.png b/public/images/messier/m17.png new file mode 100644 index 0000000..700802f Binary files /dev/null and b/public/images/messier/m17.png differ diff --git a/public/images/messier/m18.png b/public/images/messier/m18.png new file mode 100644 index 0000000..c11d577 Binary files /dev/null and b/public/images/messier/m18.png differ diff --git a/public/images/messier/m19.png b/public/images/messier/m19.png new file mode 100644 index 0000000..e8cd9c5 Binary files /dev/null and b/public/images/messier/m19.png differ diff --git a/public/images/messier/m2.png b/public/images/messier/m2.png new file mode 100644 index 0000000..5a2e515 Binary files /dev/null and b/public/images/messier/m2.png differ diff --git a/public/images/messier/m20.png b/public/images/messier/m20.png new file mode 100644 index 0000000..5551583 Binary files /dev/null and b/public/images/messier/m20.png differ diff --git a/public/images/messier/m21.png b/public/images/messier/m21.png new file mode 100644 index 0000000..abac84f Binary files /dev/null and b/public/images/messier/m21.png differ diff --git a/public/images/messier/m22.png b/public/images/messier/m22.png new file mode 100644 index 0000000..fc33003 Binary files /dev/null and b/public/images/messier/m22.png differ diff --git a/public/images/messier/m23.png b/public/images/messier/m23.png new file mode 100644 index 0000000..59e73c8 Binary files /dev/null and b/public/images/messier/m23.png differ diff --git a/public/images/messier/m24.png b/public/images/messier/m24.png new file mode 100644 index 0000000..b6e7e8a Binary files /dev/null and b/public/images/messier/m24.png differ diff --git a/public/images/messier/m25.png b/public/images/messier/m25.png new file mode 100644 index 0000000..4d2f98d Binary files /dev/null and b/public/images/messier/m25.png differ diff --git a/public/images/messier/m26.png b/public/images/messier/m26.png new file mode 100644 index 0000000..9022648 Binary files /dev/null and b/public/images/messier/m26.png differ diff --git a/public/images/messier/m27.png b/public/images/messier/m27.png new file mode 100644 index 0000000..f8adb63 Binary files /dev/null and b/public/images/messier/m27.png differ diff --git a/public/images/messier/m28.png b/public/images/messier/m28.png new file mode 100644 index 0000000..048a0b5 Binary files /dev/null and b/public/images/messier/m28.png differ diff --git a/public/images/messier/m29.png b/public/images/messier/m29.png new file mode 100644 index 0000000..3224169 Binary files /dev/null and b/public/images/messier/m29.png differ diff --git a/public/images/messier/m3.png b/public/images/messier/m3.png new file mode 100644 index 0000000..88bc3a5 Binary files /dev/null and b/public/images/messier/m3.png differ diff --git a/public/images/messier/m30.png b/public/images/messier/m30.png new file mode 100644 index 0000000..ff6baa1 Binary files /dev/null and b/public/images/messier/m30.png differ diff --git a/public/images/messier/m31.png b/public/images/messier/m31.png new file mode 100644 index 0000000..63c18d1 Binary files /dev/null and b/public/images/messier/m31.png differ diff --git a/public/images/messier/m33.png b/public/images/messier/m33.png new file mode 100644 index 0000000..7b81162 Binary files /dev/null and b/public/images/messier/m33.png differ diff --git a/public/images/messier/m34.png b/public/images/messier/m34.png new file mode 100644 index 0000000..8b08bfb Binary files /dev/null and b/public/images/messier/m34.png differ diff --git a/public/images/messier/m35.png b/public/images/messier/m35.png new file mode 100644 index 0000000..b48751a Binary files /dev/null and b/public/images/messier/m35.png differ diff --git a/public/images/messier/m36.png b/public/images/messier/m36.png new file mode 100644 index 0000000..b2d6841 Binary files /dev/null and b/public/images/messier/m36.png differ diff --git a/public/images/messier/m37.png b/public/images/messier/m37.png new file mode 100644 index 0000000..16d7f56 Binary files /dev/null and b/public/images/messier/m37.png differ diff --git a/public/images/messier/m38.png b/public/images/messier/m38.png new file mode 100644 index 0000000..bb1c87c Binary files /dev/null and b/public/images/messier/m38.png differ diff --git a/public/images/messier/m39.png b/public/images/messier/m39.png new file mode 100644 index 0000000..211eea6 Binary files /dev/null and b/public/images/messier/m39.png differ diff --git a/public/images/messier/m4.png b/public/images/messier/m4.png new file mode 100644 index 0000000..e13bc16 Binary files /dev/null and b/public/images/messier/m4.png differ diff --git a/public/images/messier/m41.png b/public/images/messier/m41.png new file mode 100644 index 0000000..fed137e Binary files /dev/null and b/public/images/messier/m41.png differ diff --git a/public/images/messier/m42.png b/public/images/messier/m42.png new file mode 100644 index 0000000..80ed4da Binary files /dev/null and b/public/images/messier/m42.png differ diff --git a/public/images/messier/m44.png b/public/images/messier/m44.png new file mode 100644 index 0000000..faa8d40 Binary files /dev/null and b/public/images/messier/m44.png differ diff --git a/public/images/messier/m46.png b/public/images/messier/m46.png new file mode 100644 index 0000000..e7ac59d Binary files /dev/null and b/public/images/messier/m46.png differ diff --git a/public/images/messier/m47.png b/public/images/messier/m47.png new file mode 100644 index 0000000..091c2b2 Binary files /dev/null and b/public/images/messier/m47.png differ diff --git a/public/images/messier/m48.png b/public/images/messier/m48.png new file mode 100644 index 0000000..267c190 Binary files /dev/null and b/public/images/messier/m48.png differ diff --git a/public/images/messier/m49.png b/public/images/messier/m49.png new file mode 100644 index 0000000..49d4c75 Binary files /dev/null and b/public/images/messier/m49.png differ diff --git a/public/images/messier/m5.png b/public/images/messier/m5.png new file mode 100644 index 0000000..572413a Binary files /dev/null and b/public/images/messier/m5.png differ diff --git a/public/images/messier/m50.png b/public/images/messier/m50.png new file mode 100644 index 0000000..9ec90fa Binary files /dev/null and b/public/images/messier/m50.png differ diff --git a/public/images/messier/m51.png b/public/images/messier/m51.png new file mode 100644 index 0000000..d6bb372 Binary files /dev/null and b/public/images/messier/m51.png differ diff --git a/public/images/messier/m52.png b/public/images/messier/m52.png new file mode 100644 index 0000000..264e7d6 Binary files /dev/null and b/public/images/messier/m52.png differ diff --git a/public/images/messier/m53.png b/public/images/messier/m53.png new file mode 100644 index 0000000..9e12271 Binary files /dev/null and b/public/images/messier/m53.png differ diff --git a/public/images/messier/m54.png b/public/images/messier/m54.png new file mode 100644 index 0000000..50ee74e Binary files /dev/null and b/public/images/messier/m54.png differ diff --git a/public/images/messier/m55.png b/public/images/messier/m55.png new file mode 100644 index 0000000..a242b9a Binary files /dev/null and b/public/images/messier/m55.png differ diff --git a/public/images/messier/m56.png b/public/images/messier/m56.png new file mode 100644 index 0000000..9dfab1d Binary files /dev/null and b/public/images/messier/m56.png differ diff --git a/public/images/messier/m57.png b/public/images/messier/m57.png new file mode 100644 index 0000000..e0bb75a Binary files /dev/null and b/public/images/messier/m57.png differ diff --git a/public/images/messier/m58.png b/public/images/messier/m58.png new file mode 100644 index 0000000..7345200 Binary files /dev/null and b/public/images/messier/m58.png differ diff --git a/public/images/messier/m59.png b/public/images/messier/m59.png new file mode 100644 index 0000000..bbe024a Binary files /dev/null and b/public/images/messier/m59.png differ diff --git a/public/images/messier/m6.png b/public/images/messier/m6.png new file mode 100644 index 0000000..ce2078d Binary files /dev/null and b/public/images/messier/m6.png differ diff --git a/public/images/messier/m60.png b/public/images/messier/m60.png new file mode 100644 index 0000000..30c2a72 Binary files /dev/null and b/public/images/messier/m60.png differ diff --git a/public/images/messier/m61.png b/public/images/messier/m61.png new file mode 100644 index 0000000..3208b77 Binary files /dev/null and b/public/images/messier/m61.png differ diff --git a/public/images/messier/m62.png b/public/images/messier/m62.png new file mode 100644 index 0000000..e825ff6 Binary files /dev/null and b/public/images/messier/m62.png differ diff --git a/public/images/messier/m63.png b/public/images/messier/m63.png new file mode 100644 index 0000000..c503dbe Binary files /dev/null and b/public/images/messier/m63.png differ diff --git a/public/images/messier/m64.png b/public/images/messier/m64.png new file mode 100644 index 0000000..cd0967d Binary files /dev/null and b/public/images/messier/m64.png differ diff --git a/public/images/messier/m65.png b/public/images/messier/m65.png new file mode 100644 index 0000000..47bf1fc Binary files /dev/null and b/public/images/messier/m65.png differ diff --git a/public/images/messier/m66.png b/public/images/messier/m66.png new file mode 100644 index 0000000..b0f45fb Binary files /dev/null and b/public/images/messier/m66.png differ diff --git a/public/images/messier/m67.png b/public/images/messier/m67.png new file mode 100644 index 0000000..677b8ef Binary files /dev/null and b/public/images/messier/m67.png differ diff --git a/public/images/messier/m68.png b/public/images/messier/m68.png new file mode 100644 index 0000000..031146e Binary files /dev/null and b/public/images/messier/m68.png differ diff --git a/public/images/messier/m69.png b/public/images/messier/m69.png new file mode 100644 index 0000000..b97e942 Binary files /dev/null and b/public/images/messier/m69.png differ diff --git a/public/images/messier/m7.png b/public/images/messier/m7.png new file mode 100644 index 0000000..f519bf5 Binary files /dev/null and b/public/images/messier/m7.png differ diff --git a/public/images/messier/m70.png b/public/images/messier/m70.png new file mode 100644 index 0000000..e5f4591 Binary files /dev/null and b/public/images/messier/m70.png differ diff --git a/public/images/messier/m71.png b/public/images/messier/m71.png new file mode 100644 index 0000000..3e63231 Binary files /dev/null and b/public/images/messier/m71.png differ diff --git a/public/images/messier/m72.png b/public/images/messier/m72.png new file mode 100644 index 0000000..1406c3f Binary files /dev/null and b/public/images/messier/m72.png differ diff --git a/public/images/messier/m73.png b/public/images/messier/m73.png new file mode 100644 index 0000000..2e8981e Binary files /dev/null and b/public/images/messier/m73.png differ diff --git a/public/images/messier/m74.png b/public/images/messier/m74.png new file mode 100644 index 0000000..bb33e2f Binary files /dev/null and b/public/images/messier/m74.png differ diff --git a/public/images/messier/m75.png b/public/images/messier/m75.png new file mode 100644 index 0000000..c668457 Binary files /dev/null and b/public/images/messier/m75.png differ diff --git a/public/images/messier/m76.png b/public/images/messier/m76.png new file mode 100644 index 0000000..bd0ee32 Binary files /dev/null and b/public/images/messier/m76.png differ diff --git a/public/images/messier/m77.png b/public/images/messier/m77.png new file mode 100644 index 0000000..26b6da5 Binary files /dev/null and b/public/images/messier/m77.png differ diff --git a/public/images/messier/m78.png b/public/images/messier/m78.png new file mode 100644 index 0000000..d47d04d Binary files /dev/null and b/public/images/messier/m78.png differ diff --git a/public/images/messier/m79.png b/public/images/messier/m79.png new file mode 100644 index 0000000..3b93c1f Binary files /dev/null and b/public/images/messier/m79.png differ diff --git a/public/images/messier/m8.png b/public/images/messier/m8.png new file mode 100644 index 0000000..09afbfd Binary files /dev/null and b/public/images/messier/m8.png differ diff --git a/public/images/messier/m80.png b/public/images/messier/m80.png new file mode 100644 index 0000000..166a757 Binary files /dev/null and b/public/images/messier/m80.png differ diff --git a/public/images/messier/m81.png b/public/images/messier/m81.png new file mode 100644 index 0000000..6dd144d Binary files /dev/null and b/public/images/messier/m81.png differ diff --git a/public/images/messier/m82.png b/public/images/messier/m82.png new file mode 100644 index 0000000..6443796 Binary files /dev/null and b/public/images/messier/m82.png differ diff --git a/public/images/messier/m83.png b/public/images/messier/m83.png new file mode 100644 index 0000000..720cd6e Binary files /dev/null and b/public/images/messier/m83.png differ diff --git a/public/images/messier/m85.png b/public/images/messier/m85.png new file mode 100644 index 0000000..6ec5464 Binary files /dev/null and b/public/images/messier/m85.png differ diff --git a/public/images/messier/m88.png b/public/images/messier/m88.png new file mode 100644 index 0000000..6f3ec3a Binary files /dev/null and b/public/images/messier/m88.png differ diff --git a/public/images/messier/m89.png b/public/images/messier/m89.png new file mode 100644 index 0000000..a31c4d5 Binary files /dev/null and b/public/images/messier/m89.png differ diff --git a/public/images/messier/m9.png b/public/images/messier/m9.png new file mode 100644 index 0000000..407e1b3 Binary files /dev/null and b/public/images/messier/m9.png differ diff --git a/public/images/messier/m90.png b/public/images/messier/m90.png new file mode 100644 index 0000000..1017b7c Binary files /dev/null and b/public/images/messier/m90.png differ diff --git a/public/images/messier/m91.png b/public/images/messier/m91.png new file mode 100644 index 0000000..75f700e Binary files /dev/null and b/public/images/messier/m91.png differ diff --git a/public/images/messier/m92.png b/public/images/messier/m92.png new file mode 100644 index 0000000..a7c1eae Binary files /dev/null and b/public/images/messier/m92.png differ diff --git a/public/images/messier/m93.png b/public/images/messier/m93.png new file mode 100644 index 0000000..8ccc151 Binary files /dev/null and b/public/images/messier/m93.png differ diff --git a/public/images/messier/m94.png b/public/images/messier/m94.png new file mode 100644 index 0000000..0b87c9c Binary files /dev/null and b/public/images/messier/m94.png differ diff --git a/public/images/messier/m95.png b/public/images/messier/m95.png new file mode 100644 index 0000000..1387608 Binary files /dev/null and b/public/images/messier/m95.png differ diff --git a/public/images/messier/m96.png b/public/images/messier/m96.png new file mode 100644 index 0000000..1a715d8 Binary files /dev/null and b/public/images/messier/m96.png differ diff --git a/public/images/messier/m97.png b/public/images/messier/m97.png new file mode 100644 index 0000000..9b5a655 Binary files /dev/null and b/public/images/messier/m97.png differ diff --git a/public/images/messier/m98.png b/public/images/messier/m98.png new file mode 100644 index 0000000..b43976c Binary files /dev/null and b/public/images/messier/m98.png differ diff --git a/public/images/messier/m99.png b/public/images/messier/m99.png new file mode 100644 index 0000000..cb21d32 Binary files /dev/null and b/public/images/messier/m99.png differ diff --git a/public/sternenhimmel.php b/public/sternenhimmel.php index 3e07729..4b49e1a 100644 --- a/public/sternenhimmel.php +++ b/public/sternenhimmel.php @@ -1140,17 +1140,175 @@ function drawAltazGrid() { // ═══════════════════════════════════════════════════════════════════════════════ // FARBE AUS B-V // ═══════════════════════════════════════════════════════════════════════════════ -function bvToColor(bv) { - if (isNaN(bv) || bv === undefined) return '#ffffff'; - if (bv < -0.30) return '#9bb0ff'; - if (bv < -0.10) return '#aabfff'; - if (bv < 0.00) return '#cad7ff'; - if (bv < 0.20) return '#f8f7ff'; - if (bv < 0.40) return '#fff4e8'; - if (bv < 0.60) return '#ffddb4'; - if (bv < 0.80) return '#ffcc6f'; - if (bv < 1.20) return '#ffaa44'; - return '#ff6622'; +function clamp01(v) { + return Math.max(0, Math.min(1, v)); +} + +function toHexByte(v) { + return Math.round(Math.max(0, Math.min(255, v))).toString(16).padStart(2, '0'); +} + +function rgbToHex(r, g, b) { + return '#' + toHexByte(r) + toHexByte(g) + toHexByte(b); +} + +function hexToRgb(hex) { + const value = String(hex || '').trim().replace('#', ''); + if (!/^[0-9a-f]{6}$/i.test(value)) return { r: 255, g: 255, b: 255 }; + return { + r: parseInt(value.slice(0, 2), 16), + g: parseInt(value.slice(2, 4), 16), + b: parseInt(value.slice(4, 6), 16), + }; +} + +function colorWithAlpha(hex, alpha) { + const rgb = hexToRgb(hex); + return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${clamp01(alpha)})`; +} + +function temperatureToColor(tempK) { + const temp = Math.max(1000, Math.min(40000, tempK)) / 100; + let r, g, b; + + if (temp <= 66) { + r = 255; + g = 99.4708025861 * Math.log(temp) - 161.1195681661; + b = temp <= 19 ? 0 : 138.5177312231 * Math.log(temp - 10) - 305.0447927307; + } else { + r = 329.698727446 * Math.pow(temp - 60, -0.1332047592); + g = 288.1221695283 * Math.pow(temp - 60, -0.0755148492); + b = 255; + } + + // Leicht entsättigen, damit die Darstellung natürlicher und weniger "neonhaft" wirkt. + const mix = 0.18; + r = r * (1 - mix) + 255 * mix; + g = g * (1 - mix) + 245 * mix; + b = b * (1 - mix) + 235 * mix; + + return rgbToHex(r, g, b); +} + +function bvToTemperature(bv) { + const x = Math.max(-0.4, Math.min(2.0, Number(bv))); + return 4600 * ( + 1 / (0.92 * x + 1.7) + + 1 / (0.92 * x + 0.62) + ); +} + +function spectralClassToColor(spect) { + const code = String(spect || '').trim().toUpperCase(); + if (!code) return '#ffffff'; + const type = code[0]; + + if (type === 'O') return temperatureToColor(32000); + if (type === 'B') return temperatureToColor(18000); + if (type === 'A') return temperatureToColor(9000); + if (type === 'F') return temperatureToColor(7200); + if (type === 'G') return temperatureToColor(5800); + if (type === 'K') return temperatureToColor(4500); + if (type === 'M') return temperatureToColor(3200); + return '#ffffff'; +} + +function bvToColor(bv, spect) { + if (Number.isFinite(Number(bv))) { + return temperatureToColor(bvToTemperature(bv)); + } + return spectralClassToColor(spect); +} + +const STAR_SPRITE_CACHE = new Map(); + +function getStarSprite(radius, color, magnitude) { + const quantRadius = Math.max(0.28, Math.round(radius * 8) / 8); + const brightFactor = clamp01((2.2 - magnitude) / 4.5); + const brightBucket = Math.round(brightFactor * 4); + const spikeMode = magnitude < 0.5 ? 2 : (magnitude < 1.4 ? 1 : 0); + const key = [quantRadius.toFixed(2), color, brightBucket, spikeMode].join('|'); + if (STAR_SPRITE_CACHE.has(key)) return STAR_SPRITE_CACHE.get(key); + + const outerHaloRadius = Math.max(quantRadius * 3.4, 1.15); + const innerHaloRadius = Math.max(quantRadius * 1.65, 0.72); + const coreRadius = Math.max(quantRadius * 0.34, 0.18); + const spikeLength = spikeMode ? Math.max(quantRadius * (7 + brightFactor * 8), 4.5) : 0; + const pad = Math.ceil(Math.max(outerHaloRadius, spikeLength) + 3); + const size = pad * 2; + + const spriteCanvas = document.createElement('canvas'); + spriteCanvas.width = size; + spriteCanvas.height = size; + const sctx = spriteCanvas.getContext('2d'); + const cxSprite = pad; + const cySprite = pad; + + const outerHalo = sctx.createRadialGradient(cxSprite, cySprite, 0, cxSprite, cySprite, outerHaloRadius); + outerHalo.addColorStop(0.00, colorWithAlpha(color, 0.05 + brightFactor * 0.05)); + outerHalo.addColorStop(0.20, colorWithAlpha(color, 0.02 + brightFactor * 0.03)); + outerHalo.addColorStop(0.55, colorWithAlpha(color, 0.006 + brightFactor * 0.012)); + outerHalo.addColorStop(1.00, 'transparent'); + sctx.fillStyle = outerHalo; + sctx.beginPath(); + sctx.arc(cxSprite, cySprite, outerHaloRadius, 0, Math.PI * 2); + sctx.fill(); + + const innerHalo = sctx.createRadialGradient(cxSprite, cySprite, 0, cxSprite, cySprite, innerHaloRadius); + innerHalo.addColorStop(0.00, colorWithAlpha(color, 0.20)); + innerHalo.addColorStop(0.35, colorWithAlpha(color, 0.05 + brightFactor * 0.04)); + innerHalo.addColorStop(1.00, 'transparent'); + sctx.fillStyle = innerHalo; + sctx.beginPath(); + sctx.arc(cxSprite, cySprite, innerHaloRadius, 0, Math.PI * 2); + sctx.fill(); + + if (spikeMode) { + const spikeAlpha = 0.02 + brightFactor * 0.07; + sctx.strokeStyle = colorWithAlpha(color, spikeAlpha); + sctx.lineWidth = 0.55 + brightFactor * 0.35; + sctx.lineCap = 'round'; + sctx.beginPath(); + sctx.moveTo(cxSprite - spikeLength, cySprite); + sctx.lineTo(cxSprite + spikeLength, cySprite); + sctx.moveTo(cxSprite, cySprite - spikeLength); + sctx.lineTo(cxSprite, cySprite + spikeLength); + if (spikeMode === 2) { + const diag = spikeLength * 0.72; + sctx.moveTo(cxSprite - diag, cySprite - diag); + sctx.lineTo(cxSprite + diag, cySprite + diag); + sctx.moveTo(cxSprite - diag, cySprite + diag); + sctx.lineTo(cxSprite + diag, cySprite - diag); + } + sctx.stroke(); + } + + sctx.fillStyle = colorWithAlpha(color, 0.96); + sctx.beginPath(); + sctx.arc(cxSprite, cySprite, quantRadius, 0, Math.PI * 2); + sctx.fill(); + + sctx.fillStyle = colorWithAlpha('#ffffff', 0.56 + brightFactor * 0.16); + sctx.beginPath(); + sctx.arc(cxSprite, cySprite, coreRadius, 0, Math.PI * 2); + sctx.fill(); + + const sprite = { canvas: spriteCanvas, pad }; + STAR_SPRITE_CACHE.set(key, sprite); + return sprite; +} + +function drawStarSprite(x, y, radius, color, magnitude) { + if (magnitude > 3.4) { + ctx.fillStyle = colorWithAlpha(color, 0.92); + ctx.beginPath(); + ctx.arc(x, y, Math.max(radius * 0.72, 0.32), 0, Math.PI * 2); + ctx.fill(); + return; + } + + const sprite = getStarSprite(radius, color, magnitude); + ctx.drawImage(sprite.canvas, x - sprite.pad, y - sprite.pad); } // ═══════════════════════════════════════════════════════════════════════════════ @@ -1390,19 +1548,9 @@ function render() { const t = (magLimit - s.mag) / (magLimit + 1.5); const radius = Math.max(0.4, t * 3.6); - const color = bvToColor(s.ci); + const color = bvToColor(s.ci, s.spect); - if (s.mag < CFG.stars.glowBelowMag) { - const glow = createSafeRadialGradient(pt.x, pt.y, 0, pt.x, pt.y, radius * 6); - if (glow) { - glow.addColorStop(0, color + 'bb'); glow.addColorStop(0.3, color + '33'); - glow.addColorStop(1, 'transparent'); - ctx.fillStyle = glow; - ctx.beginPath(); ctx.arc(pt.x, pt.y, radius * 6, 0, Math.PI * 2); ctx.fill(); - } - } - ctx.fillStyle = color; - ctx.beginPath(); ctx.arc(pt.x, pt.y, radius, 0, Math.PI * 2); ctx.fill(); + drawStarSprite(pt.x, pt.y, radius, color, s.mag); if (labelStars && s.proper && s.mag < CFG.stars.labelBelowMag) { ctx.fillStyle = CFG.stars.colorLabel; @@ -1928,6 +2076,17 @@ document.getElementById('fileInput').addEventListener('change', function(e) { // TOOLTIP // ═══════════════════════════════════════════════════════════════════════════════ let _mouseDownPos = null; + +function enhanceMessierTooltip(tip, obj) { + const image = tip.querySelector('.tt-image'); + if (!image) return; + image.addEventListener('error', function handleError() { + const media = tip.querySelector('.tt-media'); + if (media) media.remove(); + }, { once: true }); + image.src = 'images/messier/m' + obj.m + '.png'; +} + canvas.addEventListener('mousedown', function(e) { _mouseDownPos = { x: e.clientX, y: e.clientY }; }, true); @@ -1998,12 +2157,14 @@ canvas.addEventListener('click', function(e) { tip.innerHTML = 'M' + obj.m + (obj.name ? ' – ' + obj.name : '') + '' + + '