Mondfinsternis-Einfärbung in der Mondphasenleiste der Monatsvorhersage ergänzen
Analog zu moonyear.php wird die Mondscheibe je nach Finsternisart (total, partiell, Halbschatten) eingefärbt, basierend auf den bereits geladenen Mondfinsternis-Ereignissen des Monats. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -285,6 +285,7 @@ $planetDataJson = '[]';
|
|||||||
$moonDataJson = 'null';
|
$moonDataJson = 'null';
|
||||||
$monthChartCometsJson = '[]';
|
$monthChartCometsJson = '[]';
|
||||||
$moonPhaseEventsJson = '[]';
|
$moonPhaseEventsJson = '[]';
|
||||||
|
$monthLunarEclipsesJson = '{}';
|
||||||
$monthEventListJson = '[]';
|
$monthEventListJson = '[]';
|
||||||
$starDataErrorJson = 'null';
|
$starDataErrorJson = 'null';
|
||||||
$observationTipCalendarIcsJson = '""';
|
$observationTipCalendarIcsJson = '""';
|
||||||
@@ -3197,6 +3198,30 @@ $monthChartComets = array_map(
|
|||||||
);
|
);
|
||||||
$monthChartCometsJson = json_encode($monthChartComets, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
$monthChartCometsJson = json_encode($monthChartComets, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
$moonPhaseEventsJson = json_encode($moonPhaseEvents, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
$moonPhaseEventsJson = json_encode($moonPhaseEvents, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
|
|
||||||
|
// Mondfinsternisse dieses Monats, nach Tag gruppiert (Peak-Ereignis reicht für
|
||||||
|
// die Einfärbung der Mondscheibe in der Mondphasenleiste, analog zu moonyear.php)
|
||||||
|
$monthLunarEclipsesByDay = [];
|
||||||
|
foreach ($eclipseEvents as $eclipseEvent) {
|
||||||
|
if (!is_array($eclipseEvent)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (($eclipseEvent['category'] ?? '') !== 'lunar_eclipse' || ($eclipseEvent['stage'] ?? '') !== 'peak') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$eclipseDateParts = explode('.', (string) ($eclipseEvent['local_date'] ?? ''));
|
||||||
|
$eclipseDay = isset($eclipseDateParts[0]) ? (int) $eclipseDateParts[0] : 0;
|
||||||
|
if ($eclipseDay < 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$monthLunarEclipsesByDay[$eclipseDay] = [
|
||||||
|
'kind' => (string) ($eclipseEvent['kind'] ?? ''),
|
||||||
|
'time' => (string) ($eclipseEvent['local_time'] ?? ''),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$monthLunarEclipsesJson = json_encode($monthLunarEclipsesByDay, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
$starDataErrorJson = json_encode($starDataError, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
$starDataErrorJson = json_encode($starDataError, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
$observationTipCalendarIcsJson = json_encode($observationTipCalendarIcs, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
$observationTipCalendarIcsJson = json_encode($observationTipCalendarIcs, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
$observationTipCalendarFilenameJson = json_encode(sprintf('astrotools-monatsereignisse-%04d-%02d.ics', $selectedYear, $selectedMonth), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
$observationTipCalendarFilenameJson = json_encode(sprintf('astrotools-monatsereignisse-%04d-%02d.ics', $selectedYear, $selectedMonth), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
@@ -3831,6 +3856,7 @@ const MONTH_CHART_PLANETS = <?= $planetDataJson ?: '[]' ?>;
|
|||||||
const MONTH_CHART_MOON = <?= $moonDataJson ?: 'null' ?>;
|
const MONTH_CHART_MOON = <?= $moonDataJson ?: 'null' ?>;
|
||||||
const MONTH_CHART_COMETS = <?= $monthChartCometsJson ?: '[]' ?>;
|
const MONTH_CHART_COMETS = <?= $monthChartCometsJson ?: '[]' ?>;
|
||||||
const MONTH_PHASE_EVENTS = <?= $moonPhaseEventsJson ?: '[]' ?>;
|
const MONTH_PHASE_EVENTS = <?= $moonPhaseEventsJson ?: '[]' ?>;
|
||||||
|
const MONTH_LUNAR_ECLIPSES = <?= $monthLunarEclipsesJson ?: '{}' ?>;
|
||||||
const MONTH_EVENT_LIST = <?= $monthEventListJson ?: '[]' ?>;
|
const MONTH_EVENT_LIST = <?= $monthEventListJson ?: '[]' ?>;
|
||||||
const MONTH_CHART_ERROR = <?= $starDataErrorJson ?: 'null' ?>;
|
const MONTH_CHART_ERROR = <?= $starDataErrorJson ?: 'null' ?>;
|
||||||
const OBSERVATION_TIP_ICAL = <?= $observationTipCalendarIcsJson ?: '""' ?>;
|
const OBSERVATION_TIP_ICAL = <?= $observationTipCalendarIcsJson ?: '""' ?>;
|
||||||
@@ -4355,7 +4381,7 @@ function monthChartCometRaDec(comet, date) {
|
|||||||
renderPhaseCanvas(cssWidth, cssHeight, dpr, true);
|
renderPhaseCanvas(cssWidth, cssHeight, dpr, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawMoonDisc(x, y, radius, phaseInfo) {
|
function drawMoonDisc(x, y, radius, phaseInfo, eclipseKind) {
|
||||||
const phaseRad = phaseInfo.phaseAngleDeg * Math.PI / 180;
|
const phaseRad = phaseInfo.phaseAngleDeg * Math.PI / 180;
|
||||||
const cosPhase = Math.cos(phaseRad);
|
const cosPhase = Math.cos(phaseRad);
|
||||||
|
|
||||||
@@ -4408,6 +4434,33 @@ function monthChartCometRaDec(comet, date) {
|
|||||||
ctx.drawImage(phaseImage, x - radius, y - radius, radius * 2, radius * 2);
|
ctx.drawImage(phaseImage, x - radius, y - radius, radius * 2, radius * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finsternis-Einfärbung als Overlay (analog zu moonyear.php)
|
||||||
|
if (eclipseKind === 'total') {
|
||||||
|
ctx.save();
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
||||||
|
ctx.clip();
|
||||||
|
ctx.fillStyle = 'rgba(180, 50, 10, 0.55)';
|
||||||
|
ctx.fillRect(x - radius, y - radius, radius * 2, radius * 2);
|
||||||
|
ctx.restore();
|
||||||
|
} else if (eclipseKind === 'partial') {
|
||||||
|
ctx.save();
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
||||||
|
ctx.clip();
|
||||||
|
ctx.fillStyle = 'rgba(160, 60, 10, 0.35)';
|
||||||
|
ctx.fillRect(x - radius, y - radius, radius * 2, radius * 2);
|
||||||
|
ctx.restore();
|
||||||
|
} else if (eclipseKind === 'penumbral') {
|
||||||
|
ctx.save();
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
||||||
|
ctx.clip();
|
||||||
|
ctx.fillStyle = 'rgba(80, 80, 100, 0.25)';
|
||||||
|
ctx.fillRect(x - radius, y - radius, radius * 2, radius * 2);
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
|
||||||
ctx.restore();
|
ctx.restore();
|
||||||
ctx.restore();
|
ctx.restore();
|
||||||
|
|
||||||
@@ -4466,7 +4519,8 @@ function monthChartCometRaDec(comet, date) {
|
|||||||
const radius = Math.max(23 * layoutScale, Math.min(33 * layoutScale, spacing * 0.52));
|
const radius = Math.max(23 * layoutScale, Math.min(33 * layoutScale, spacing * 0.52));
|
||||||
const x = leftPad + spacing * (dayInRow - 0.5);
|
const x = leftPad + spacing * (dayInRow - 0.5);
|
||||||
const centerY = rowCenters[row];
|
const centerY = rowCenters[row];
|
||||||
drawMoonDisc(x, centerY, radius, phaseInfoForDay(year, month, day));
|
const eclipseInfo = MONTH_LUNAR_ECLIPSES ? MONTH_LUNAR_ECLIPSES[day] : null;
|
||||||
|
drawMoonDisc(x, centerY, radius, phaseInfoForDay(year, month, day), eclipseInfo ? eclipseInfo.kind : null);
|
||||||
ctx.fillText(String(day), x, centerY + radius + (12 * layoutScale));
|
ctx.fillText(String(day), x, centerY + radius + (12 * layoutScale));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user