📄 Eclittica1-code.txt
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Eclittica Sole e Luna</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{background:#0f1923;color:#d0d8e0;font-family:'Segoe UI',Arial,sans-serif;font-size:15px;padding:10px;max-width:500px;margin:0 auto}
h1{text-align:center;color:#ffd700;font-size:1.2em;margin:8px 0;letter-spacing:1px}
.row{display:flex;gap:6px;margin:5px 0;flex-wrap:wrap}
.row>div{flex:1;min-width:70px}
.row label{display:block;font-size:0.72em;color:#7a8a9a;margin-bottom:2px}
.row input{width:100%;padding:10px 4px;background:#162233;border:1px solid #1e3a5f;color:#fff;border-radius:6px;font-size:1em;text-align:center}
.brow{display:flex;gap:8px;margin:6px 0}
.bt{flex:1;padding:14px 4px;border:none;border-radius:8px;font-size:1em;font-weight:bold;cursor:pointer;color:#fff;-webkit-tap-highlight-color:transparent;min-height:48px;touch-action:manipulation}
.bt:active{filter:brightness(1.5);transform:scale(0.96)}
.bt-c{background:#1a5276;color:#ffd700;font-size:1.1em}
.bt-n{background:#1e3a5f;color:#aac}
.bt-step{background:#1e3450;color:#c0d8f0;font-size:1.05em;min-height:52px;border:1px solid #2a4a6a}
.bt-step:active{background:#2a5a8a}
canvas{width:100%;border-radius:8px;display:block;margin:4px 0;touch-action:none}
.cvlabel{text-align:center;font-size:0.78em;color:#778899;margin:10px 0 2px;letter-spacing:0.5px}
#calInfo{text-align:center;font-size:0.76em;color:#5a7a8a;margin:4px 0}
.pn{background:#131d2a;border-radius:8px;padding:10px;margin:6px 0;border:1px solid #1a2a3a}
.pn h2{color:#ffd700;font-size:0.92em;margin-bottom:6px;padding-bottom:4px;border-bottom:1px solid #1a2a3a}
.dr{display:flex;justify-content:space-between;padding:3px 0;font-size:0.88em}
.dr .l{color:#6a7a8a}.dr .v{color:#e0e8f0;font-weight:600}
.eb{background:#131d2a;border-radius:8px;padding:10px;margin:6px 0;border-left:4px solid #333}
.eb.r{border-left-color:#e74c3c;background:#1a1215}
.eb.y{border-left-color:#f0ad1e;background:#1a1915}
.eb.g{border-left-color:#27ae60}
.eb h2{color:#ffd700;font-size:0.92em;margin-bottom:4px}
.eb p{font-size:0.88em;line-height:1.45}
.note{text-align:center;font-size:0.7em;color:#445566;margin:10px 0 4px;line-height:1.3}
.seplabel{text-align:center;font-size:0.72em;color:#556677;margin:2px 0 0}
</style>
</head>
<body>
<h1>☀️ Eclittica Sole — Luna 🌙</h1>
<div class="row">
<div><label>Lat °N</label><input id="lat" type="number" step="0.01" value="43.77"></div>
<div><label>Lon °E</label><input id="lon" type="number" step="0.01" value="11.25"></div>
</div>
<div class="row">
<div><label>Anno</label><input id="yr" type="number" value="2025"></div>
<div><label>Mese</label><input id="mo" type="number" min="1" max="12" value="1"></div>
<div><label>Giorno</label><input id="dy" type="number" min="1" max="31" value="1"></div>
<div><label>Ora UTC</label><input id="hr" type="number" min="0" max="23" value="12"></div>
</div>
<div id="calInfo"></div>
<div class="brow">
<button class="bt bt-n" onclick="setNow()">📍 Adesso</button>
<button class="bt bt-c" onclick="calc()">⚙️ CALCOLA</button>
</div>
<p class="seplabel">— indietro —</p>
<div class="brow">
<button class="bt bt-step" onclick="step(-1)">◀ 1g</button>
<button class="bt bt-step" onclick="step(-7)">◀ 7g</button>
<button class="bt bt-step" onclick="step(-30)">◀ 30g</button>
</div>
<p class="seplabel">— avanti —</p>
<div class="brow">
<button class="bt bt-step" onclick="step(1)">1g ▶</button>
<button class="bt bt-step" onclick="step(7)">7g ▶</button>
<button class="bt bt-step" onclick="step(30)">30g ▶</button>
</div>
<p class="cvlabel">🔭 VISTA POLARE — dal polo nord eclittico</p>
<canvas id="cv"></canvas>
<p class="cvlabel">📐 VISTA LATERALE — profilo eclittica (latitudine Luna)</p>
<canvas id="cv2"></canvas>
<div class="pn">
<h2>☀️ Sole</h2>
<div class="dr"><span class="l">Long. eclittica</span><span class="v" id="sL">—</span></div>
<div class="dr"><span class="l">Altezza sull'orizzonte</span><span class="v" id="sA">—</span></div>
<div class="dr"><span class="l">Azimut</span><span class="v" id="sZ">—</span></div>
<div class="dr"><span class="l">Declinazione</span><span class="v" id="sD">—</span></div>
<div class="dr"><span class="l">Pannello ottimale</span><span class="v" id="sP">—</span></div>
</div>
<div class="pn">
<h2>🌙 Luna</h2>
<div class="dr"><span class="l">Long. eclittica</span><span class="v" id="mL">—</span></div>
<div class="dr"><span class="l">Lat. eclittica</span><span class="v" id="mB">—</span></div>
<div class="dr"><span class="l">Elongazione dal Sole</span><span class="v" id="mE">—</span></div>
<div class="dr"><span class="l">Fase</span><span class="v" id="mF">—</span></div>
<div class="dr"><span class="l">Illuminazione</span><span class="v" id="mI">—</span></div>
</div>
<div class="pn">
<h2>☊ Nodi lunari</h2>
<div class="dr"><span class="l">Nodo ascendente ☊</span><span class="v" id="nA">—</span></div>
<div class="dr"><span class="l">Nodo discendente ☋</span><span class="v" id="nD">—</span></div>
<div class="dr"><span class="l">Dist. Luna — nodo vicino</span><span class="v" id="nX">—</span></div>
</div>
<div class="eb" id="eB">
<h2>🔭 Probabilità eclisse</h2>
<p id="eT">Premi CALCOLA</p>
</div>
<p class="note">Algoritmi Meeus semplificati — Sole ±0.01°, Luna ±1-2°<br>
Calendario giuliano automatico prima del 15/10/1582<br>
Per date a.e.v.: 607 a.e.v. = anno −606<br>
Zona rossa nella vista laterale = fascia eclisse (±1.5° lat, ±18° lon dal nodo)</p>
<script>
var D2R=Math.PI/180;
function nr(d){d%=360;return d<0?d+360:d}
function sn(d){return Math.sin(d*D2R)}
function cs(d){return Math.cos(d*D2R)}
function asn(x){return Math.asin(Math.max(-1,Math.min(1,x)))/D2R}
function at2(y,x){return Math.atan2(y,x)/D2R}
/* Julian Day — giuliano/gregoriano automatico */
function jd(y0,m0,d,h){
var y=y0,m=m0;
if(m<=2){y--;m+=12}
var A=Math.floor(y/100),B=0;
/* Gregoriano solo dal 15 ottobre 1582 */
if(y0>1582||(y0==1582&&m0>10)||(y0==1582&&m0==10&&d>=15)){
B=2-A+Math.floor(A/4);
}
return Math.floor(365.25*(y+4716))+Math.floor(30.6001*(m+1))+d+h/24+B-1524.5;
}
/* JD → calendario — giuliano/gregoriano automatico */
function jd2cal(J){
var z=Math.floor(J+0.5),f=J+0.5-z,A;
if(z<2299161)A=z;
else{var a=Math.floor((z-1867216.25)/36524.25);A=z+1+a-Math.floor(a/4)}
var B=A+1524,C=Math.floor((B-122.1)/365.25),D=Math.floor(365.25*C),E=Math.floor((B-D)/30.6001);
var day=B-D-Math.floor(30.6001*E)+f;
var mon=E<14?E-1:E-13;
var yr=mon>2?C-4716:C-4715;
return{y:yr,m:mon,d:Math.floor(day)};
}
function getSun(J){
var T=(J-2451545)/36525,
L0=nr(280.46646+36000.76983*T+0.0003032*T*T),
M=nr(357.52911+35999.05029*T-0.0001537*T*T),
C=(1.914602-0.004817*T-0.000014*T*T)*sn(M)+(0.019993-0.000101*T)*sn(2*M)+0.000289*sn(3*M),
sl=nr(L0+C),
om=nr(125.04-1934.136*T),
lam=nr(sl-0.00569-0.00478*sn(om)),
eps=23.4393-0.013*T,
dec=asn(sn(eps)*sn(lam)),
ra=nr(at2(cs(eps)*sn(lam),cs(lam)));
return{lon:lam,dec:dec,ra:ra};
}
function getMoon(J){
var T=(J-2451545)/36525,
Lp=nr(218.3165+481267.8813*T),
D=nr(297.8502+445267.1115*T),
M=nr(357.5291+35999.0503*T),
Mp=nr(134.9634+477198.8676*T),
F=nr(93.272+483202.0175*T),
om=nr(125.04452-1934.13626*T);
var dl=6.289*sn(Mp)+1.274*sn(2*D-Mp)+0.658*sn(2*D)+0.214*sn(2*Mp)
-0.186*sn(M)-0.114*sn(2*F)+0.059*sn(2*D-2*Mp)+0.057*sn(2*D-M-Mp)
+0.053*sn(2*D+Mp)+0.046*sn(2*D-M)-0.041*sn(M-Mp)-0.035*sn(D)
-0.031*sn(M+Mp)+0.015*sn(2*D-2*F)+0.012*sn(Mp-2*F);
var db=5.128*sn(F)+0.281*sn(Mp+F)+0.278*sn(Mp-F)+0.173*sn(2*D-F)
+0.055*sn(2*D-Mp+F)+0.046*sn(2*D-Mp-F)+0.033*sn(2*D+F)+0.017*sn(2*Mp+F);
return{lon:nr(Lp+dl),lat:db,asc:om,desc:nr(om+180)};
}
function getAltAz(ra,dec,lat,lon,J){
var T=(J-2451545)/36525,
GST=nr(280.46061837+360.98564736629*(J-2451545)+0.000387933*T*T),
LST=nr(GST+lon),HA=nr(LST-ra);
var alt=asn(sn(lat)*sn(dec)+cs(lat)*cs(dec)*cs(HA));
var az=nr(at2(-sn(HA)*cs(dec),sn(dec)*cs(lat)-cs(dec)*sn(lat)*cs(HA)));
return{alt:alt,az:az};
}
var ZS=['♈','♉','♊','♋','♌','♍','♎','♏','♐','♑','♒','♓'];
var ZN=['Ari','Tau','Gem','Cnc','Leo','Vir','Lib','Sco','Sgr','Cap','Aqr','Psc'];
function zod(l){var i=Math.floor(nr(l)/30)%12;return ZS[i]+' '+(nr(l)%30).toFixed(1)+'° '+ZN[i]}
function phIco(e){
if(e<22.5)return'🌑';if(e<67.5)return'🌒';if(e<112.5)return'🌓';
if(e<157.5)return'🌔';if(e<202.5)return'🌕';if(e<247.5)return'🌖';
if(e<292.5)return'🌗';if(e<337.5)return'🌘';return'🌑';
}
function phNm(e){
if(e<22.5)return'Nuova';if(e<67.5)return'Cresc.';if(e<112.5)return'Primo quarto';
if(e<157.5)return'Gibb. cresc.';if(e<202.5)return'Piena';if(e<247.5)return'Gibb. cal.';
if(e<292.5)return'Ult. quarto';if(e<337.5)return'Calante';return'Nuova';
}
function azLabel(a){
var dirs=['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSO','SO','OSO','O','ONO','NO','NNO'];
return dirs[Math.round(a/22.5)%16];
}
function setNow(){
var n=new Date();
document.getElementById('yr').value=n.getFullYear();
document.getElementById('mo').value=n.getMonth()+1;
document.getElementById('dy').value=n.getDate();
document.getElementById('hr').value=n.getUTCHours();
calc();
}
function step(days){
var y=+document.getElementById('yr').value,
m=+document.getElementById('mo').value,
d=+document.getElementById('dy').value,
h=+document.getElementById('hr').value;
var J=jd(y,m,d,h)+days;
var c=jd2cal(J);
document.getElementById('yr').value=c.y;
document.getElementById('mo').value=c.m;
document.getElementById('dy').value=c.d;
calc();
}
/* ===== VISTA POLARE (dall'alto) ===== */
function drawPolar(s,m){
var cv=document.getElementById('cv'),dpr=window.devicePixelRatio||1;
var w=cv.parentElement.clientWidth;
cv.style.width=w+'px';cv.style.height=w+'px';
cv.width=w*dpr;cv.height=w*dpr;
var c=cv.getContext('2d');c.scale(dpr,dpr);
var cx=w/2,cy=w/2,R=w*0.35;
c.fillStyle='#080e15';c.fillRect(0,0,w,w);
for(var i=0;i<80;i++){
var sx2=(i*137.508+23.7)%w,sy2=(i*97.31+41.3)%w;
c.fillStyle='rgba(180,200,230,'+(0.15+((i*73)%100)/200)+')';
c.beginPath();c.arc(sx2,sy2,0.4+((i*31)%10)/15,0,6.283);c.fill();
}
c.strokeStyle='rgba(40,70,110,0.35)';c.lineWidth=10;
c.beginPath();c.arc(cx,cy,R,0,6.283);c.stroke();
c.strokeStyle='#2a4060';c.lineWidth=2.5;
c.beginPath();c.arc(cx,cy,R,0,6.283);c.stroke();
function l2xy(lon,off){
var a=-lon*D2R;
return{x:cx+(R+(off||0))*Math.cos(a),y:cy+(R+(off||0))*Math.sin(a)};
}
var fs=w>350?15:w>300?13:11;
c.textAlign='center';c.textBaseline='middle';
for(var i=0;i<12;i++){
var a0=-i*30*D2R;
c.strokeStyle='#1e3048';c.lineWidth=1;
c.beginPath();
c.moveTo(cx+(R-7)*Math.cos(a0),cy+(R-7)*Math.sin(a0));
c.lineTo(cx+(R+7)*Math.cos(a0),cy+(R+7)*Math.sin(a0));
c.stroke();
var am=-(i*30+15)*D2R,lr=R+(w>350?24:19);
c.fillStyle='#4a6878';c.font=fs+'px serif';
c.fillText(ZS[i],cx+lr*Math.cos(am),cy+lr*Math.sin(am));
}
var nf=w>350?18:15;c.font=nf+'px serif';
var ap=l2xy(m.asc);c.fillStyle='#38b0d0';c.fillText('☊',ap.x,ap.y);
var dp=l2xy(m.desc);c.fillStyle='#d06838';c.fillText('☋',dp.x,dp.y);
c.strokeStyle='rgba(80,150,190,0.18)';c.setLineDash([3,4]);c.lineWidth=1;
c.beginPath();c.moveTo(ap.x,ap.y);c.lineTo(dp.x,dp.y);c.stroke();c.setLineDash([]);
c.font=(fs-3)+'px sans-serif';
c.fillStyle='#38b0d0';var anl=l2xy(m.asc,-20);c.fillText('☊'+m.asc.toFixed(0)+'°',anl.x,anl.y);
c.fillStyle='#d06838';var dnl=l2xy(m.desc,-20);c.fillText('☋'+m.desc.toFixed(0)+'°',dnl.x,dnl.y);
c.strokeStyle='rgba(160,180,210,0.2)';c.lineWidth=1.5;c.setLineDash([4,4]);
c.beginPath();
for(var deg=0;deg<360;deg+=2){
var distFromAsc=nr(deg-m.asc);
var moffD=-5.14*sn(distFromAsc)*(R*0.055);
var pt=l2xy(deg,moffD);
if(deg===0)c.moveTo(pt.x,pt.y);else c.lineTo(pt.x,pt.y);
}
c.closePath();c.stroke();c.setLineDash([]);
var sp=l2xy(s.lon);
var sg=c.createRadialGradient(sp.x,sp.y,4,sp.x,sp.y,28);
sg.addColorStop(0,'rgba(255,220,40,0.8)');sg.addColorStop(0.5,'rgba(255,180,20,0.2)');sg.addColorStop(1,'rgba(255,180,20,0)');
c.fillStyle=sg;c.beginPath();c.arc(sp.x,sp.y,28,0,6.283);c.fill();
c.strokeStyle='rgba(255,210,50,0.3)';c.lineWidth=1.5;
for(var i=0;i<8;i++){
var ra2=i*Math.PI/4;
c.beginPath();c.moveTo(sp.x+14*Math.cos(ra2),sp.y+14*Math.sin(ra2));
c.lineTo(sp.x+22*Math.cos(ra2),sp.y+22*Math.sin(ra2));c.stroke();
}
c.fillStyle='#ffdd33';c.beginPath();c.arc(sp.x,sp.y,12,0,6.283);c.fill();
c.fillStyle='#b09000';c.font='bold 11px sans-serif';c.fillText('☉',sp.x,sp.y+1);
var moff=-m.lat*(R*0.055);
var mp=l2xy(m.lon,moff);
if(Math.abs(m.lat)>0.3){
var mp0=l2xy(m.lon,0);
c.strokeStyle='rgba(160,190,220,0.35)';c.lineWidth=1;c.setLineDash([2,2]);
c.beginPath();c.moveTo(mp0.x,mp0.y);c.lineTo(mp.x,mp.y);c.stroke();c.setLineDash([]);
}
var mg=c.createRadialGradient(mp.x,mp.y,3,mp.x,mp.y,18);
mg.addColorStop(0,'rgba(200,215,245,0.55)');mg.addColorStop(1,'rgba(200,215,245,0)');
c.fillStyle=mg;c.beginPath();c.arc(mp.x,mp.y,18,0,6.283);c.fill();
c.fillStyle='#c0d0e0';c.beginPath();c.arc(mp.x,mp.y,10,0,6.283);c.fill();
var elong=nr(m.lon-s.lon);
var phAngle=(elong+180)*D2R;
c.fillStyle='rgba(20,30,50,0.45)';c.beginPath();
c.arc(mp.x,mp.y,10,phAngle-Math.PI/2,phAngle+Math.PI/2);c.fill();
c.fillStyle='#7788aa';c.font='9px sans-serif';c.fillText('☽',mp.x,mp.y+1);
c.strokeStyle='rgba(255,200,80,0.25)';c.lineWidth=3;c.setLineDash([4,3]);
var ea1=-s.lon*D2R,ea2=-m.lon*D2R;
c.beginPath();
if(elong<=180){c.arc(cx,cy,R*0.55,ea1,ea2,true)}
else{c.arc(cx,cy,R*0.55,ea1,ea2,false)}
c.stroke();c.setLineDash([]);
var lf=w>350?13:w>300?11:10;
c.font='bold '+lf+'px sans-serif';c.textAlign='center';
c.fillStyle='#ffd633';c.fillText('☀ '+s.lon.toFixed(1)+'°',sp.x,sp.y-20);
c.fillStyle='#a0b8d0';
var moonLabel='☽ '+m.lon.toFixed(1)+'°';
if(Math.abs(m.lat)>0.3)moonLabel+=' (β'+(m.lat>0?'+':'')+m.lat.toFixed(1)+'°)';
c.fillText(moonLabel,mp.x,mp.y+22);
var emid=-(s.lon+elong/2)*D2R;
var elx=cx+R*0.45*Math.cos(emid),ely=cy+R*0.45*Math.sin(emid);
c.fillStyle='rgba(255,200,80,0.6)';c.font=(lf-1)+'px sans-serif';
c.fillText(elong.toFixed(1)+'°',elx,ely);
var vp=l2xy(0,R*0.22);
c.fillStyle='#558855';c.font=(lf-1)+'px sans-serif';
c.fillText('γ 0°',vp.x,vp.y);
c.fillStyle='#2a3a4a';c.font=(lf-3)+'px sans-serif';c.textAlign='left';
c.fillText('Polo nord eclittico — long. crescente ⟲',8,w-8);
}
/* ===== VISTA LATERALE (edgewise) ===== */
function drawEdge(s,m){
var cv=document.getElementById('cv2'),dpr=window.devicePixelRatio||1;
var w=cv.parentElement.clientWidth;
var h=Math.round(Math.min(240,w*0.55));
cv.style.width=w+'px';cv.style.height=h+'px';
cv.width=w*dpr;cv.height=h*dpr;
var c=cv.getContext('2d');c.scale(dpr,dpr);
var P={l:30,r:8,t:16,b:24};
var pw=w-P.l-P.r,ph=h-P.t-P.b;
var midY=P.t+ph/2;
var LR=8;
function lon2x(lon){return P.l+(nr(lon)/360)*pw}
function lat2y(lat){return midY-(lat/LR)*(ph/2)}
c.fillStyle='#080e15';c.fillRect(0,0,w,h);
/* zone eclisse: ±1.5° lat, ±18° lon da ogni nodo */
function drawZone(nodeLon){
var x1=lon2x(nodeLon-18),x2=lon2x(nodeLon+18);
var yt=lat2y(1.5),yb=lat2y(-1.5);
c.fillStyle='rgba(180,40,40,0.12)';
if(x1>x2){
c.fillRect(x1,yt,P.l+pw-x1,yb-yt);
c.fillRect(P.l,yt,x2-P.l,yb-yt);
}else{
c.fillRect(x1,yt,x2-x1,yb-yt);
}
}
drawZone(m.asc);
drawZone(m.desc);
/* griglia latitudine */
c.textAlign='right';c.textBaseline='middle';
c.font='9px sans-serif';
for(var lat=-6;lat<=6;lat+=2){
var yy=lat2y(lat);
if(lat!==0){
c.strokeStyle='rgba(40,60,80,0.3)';c.lineWidth=0.5;c.setLineDash([2,3]);
c.beginPath();c.moveTo(P.l,yy);c.lineTo(P.l+pw,yy);c.stroke();c.setLineDash([]);
}
c.fillStyle='#445566';
c.fillText((lat>0?'+':'')+lat+'°',P.l-4,yy);
}
/* eclittica (lat=0) */
c.strokeStyle='#2a5070';c.lineWidth=2;
c.beginPath();c.moveTo(P.l,midY);c.lineTo(P.l+pw,midY);c.stroke();
c.fillStyle='#334455';c.textAlign='right';c.font='8px sans-serif';c.textBaseline='bottom';
c.fillText('eclittica',P.l+pw,midY-4);
/* divisioni zodiacali */
c.textAlign='center';c.textBaseline='top';
var zf=w>380?11:w>320?10:9;
c.font=zf+'px serif';
for(var i=0;i<12;i++){
var xd=lon2x(i*30);
c.strokeStyle='rgba(40,60,80,0.25)';c.lineWidth=0.5;
c.beginPath();c.moveTo(xd,P.t);c.lineTo(xd,P.t+ph);c.stroke();
var xm=lon2x(i*30+15);
c.fillStyle='#3a5565';
c.fillText(ZS[i],xm,h-P.b+6);
}
/* sinusoide orbita lunare */
c.strokeStyle='rgba(150,175,210,0.4)';c.lineWidth=1.5;c.setLineDash([4,4]);
c.beginPath();
for(var deg=0;deg<=360;deg++){
var distFromAsc=nr(deg-m.asc);
var latAtDeg=5.14*sn(distFromAsc);
var xx=P.l+(deg/360)*pw;
var yy=lat2y(latAtDeg);
if(deg===0)c.moveTo(xx,yy);else c.lineTo(xx,yy);
}
c.stroke();c.setLineDash([]);
/* nodi */
var nf2=w>350?15:13;c.font=nf2+'px serif';c.textAlign='center';c.textBaseline='middle';
c.fillStyle='#38b0d0';c.fillText('☊',lon2x(m.asc),midY);
c.fillStyle='#d06838';c.fillText('☋',lon2x(m.desc),midY);
c.font='8px sans-serif';c.textBaseline='top';
c.fillStyle='#38b0d0';c.fillText(m.asc.toFixed(0)+'°',lon2x(m.asc),midY+10);
c.fillStyle='#d06838';c.fillText(m.desc.toFixed(0)+'°',lon2x(m.desc),midY+10);
/* Sole sull'eclittica */
var sx=lon2x(s.lon);
var sg=c.createRadialGradient(sx,midY,3,sx,midY,16);
sg.addColorStop(0,'rgba(255,220,40,0.9)');sg.addColorStop(1,'rgba(255,180,20,0)');
c.fillStyle=sg;c.beginPath();c.arc(sx,midY,16,0,6.283);c.fill();
c.fillStyle='#ffdd33';c.beginPath();c.arc(sx,midY,7,0,6.283);c.fill();
c.fillStyle='#b09000';c.font='bold 8px sans-serif';c.textAlign='center';c.textBaseline='middle';
c.fillText('☉',sx,midY+1);
c.fillStyle='#ffd633';c.font='9px sans-serif';c.textBaseline='bottom';
c.fillText('☀'+s.lon.toFixed(0)+'°',sx,midY-10);
/* Luna alla sua latitudine */
var mx=lon2x(m.lon),my=lat2y(m.lat);
if(Math.abs(m.lat)>0.15){
c.strokeStyle='rgba(160,190,230,0.5)';c.lineWidth=1;c.setLineDash([2,2]);
c.beginPath();c.moveTo(mx,midY);c.lineTo(mx,my);c.stroke();c.setLineDash([]);
}
c.fillStyle='#c0d0e0';c.beginPath();c.arc(mx,my,6,0,6.283);c.fill();
c.fillStyle='#556677';c.font='7px sans-serif';c.textAlign='center';c.textBaseline='middle';
c.fillText('☽',mx,my+1);
c.fillStyle='#a0b8d0';c.font='bold 9px sans-serif';
c.textBaseline=m.lat>=0?'top':'bottom';
var mly=m.lat>=0?my-11:my+11;
c.fillText('☽ β='+(m.lat>=0?'+':'')+m.lat.toFixed(2)+'°',mx,mly);
/* titolo */
c.fillStyle='#445566';c.font='9px sans-serif';c.textAlign='left';c.textBaseline='top';
c.fillText('Profilo eclittica — zone rosse = fascia eclisse',P.l,2);
}
/* ===== CALCOLO PRINCIPALE ===== */
function calc(){
var lat=+document.getElementById('lat').value||43.77;
var lon=+document.getElementById('lon').value||11.25;
var y=+document.getElementById('yr').value||2025;
var mo=+document.getElementById('mo').value||1;
var dy=+document.getElementById('dy').value||1;
var hr=+document.getElementById('hr').value||12;
var J=jd(y,mo,dy,hr);
var isGreg=y>1582||(y==1582&&mo>10)||(y==1582&&mo==10&&dy>=15);
document.getElementById('calInfo').textContent=(isGreg?'📅 Gregoriano':'📅 Giuliano')+' — JD '+J.toFixed(1);
var s=getSun(J),m=getMoon(J);
var sa=getAltAz(s.ra,s.dec,lat,lon,J);
var elong=nr(m.lon-s.lon);
var illum=(1-cs(elong))/2*100;
var dA=Math.abs(nr(m.lon-m.asc+180)-180);
var dD=Math.abs(nr(m.lon-m.desc+180)-180);
var nDist=Math.min(dA,dD);
document.getElementById('sL').textContent=s.lon.toFixed(2)+'° '+zod(s.lon);
document.getElementById('sA').textContent=sa.alt.toFixed(1)+'°'+(sa.alt<0?' (sotto orizzonte)':'');
document.getElementById('sZ').textContent=sa.az.toFixed(1)+'° '+azLabel(sa.az);
document.getElementById('sD').textContent=(s.dec>=0?'+':'')+s.dec.toFixed(2)+'°';
var tilt=Math.max(0,lat-s.dec);
document.getElementById('sP').textContent=tilt.toFixed(1)+'° da oriz. → Sud';
document.getElementById('mL').textContent=m.lon.toFixed(2)+'° '+zod(m.lon);
document.getElementById('mB').textContent=(m.lat>=0?'+':'')+m.lat.toFixed(2)+'°';
document.getElementById('mE').textContent=elong.toFixed(1)+'°';
document.getElementById('mF').textContent=phIco(elong)+' '+phNm(elong);
document.getElementById('mI').textContent=illum.toFixed(1)+'%';
document.getElementById('nA').textContent=m.asc.toFixed(1)+'° '+zod(m.asc);
document.getElementById('nD').textContent=m.desc.toFixed(1)+'° '+zod(m.desc);
document.getElementById('nX').textContent=nDist.toFixed(1)+'°'+(nDist<18?' ⚡':'');
var eb=document.getElementById('eB'),et=document.getElementById('eT');
var nNew=elong<20||elong>340,nFull=elong>160&&elong<200;
var nNod=nDist<18,vNod=nDist<10,latLo=Math.abs(m.lat)<1.5;
if(nNew&&vNod&&latLo){
eb.className='eb r';
et.innerHTML='⚠️ <b>ECLISSE SOLARE molto probabile!</b><br>Congiunzione (elong. '+elong.toFixed(1)+'°), nodo a '+nDist.toFixed(1)+'°.<br>Lat. lunare '+m.lat.toFixed(2)+'° — nella fascia rossa della vista laterale.';
}else if(nFull&&vNod&&latLo){
eb.className='eb r';
et.innerHTML='⚠️ <b>ECLISSE LUNARE molto probabile!</b><br>Opposizione (elong. '+elong.toFixed(1)+'°), nodo a '+nDist.toFixed(1)+'°.<br>Lat. lunare '+m.lat.toFixed(2)+'° — ombra terrestre sulla Luna.';
}else if(nNew&&vNod){
eb.className='eb r';
et.innerHTML='🔴 <b>Eclisse solare possibile</b><br>Congiunzione e nodo vicino ('+nDist.toFixed(1)+'°), lat. '+m.lat.toFixed(2)+'° — possibilmente parziale.';
}else if(nFull&&vNod){
eb.className='eb r';
et.innerHTML='🔴 <b>Eclisse lunare possibile</b><br>Opposizione e nodo vicino ('+nDist.toFixed(1)+'°), lat. '+m.lat.toFixed(2)+'° — penombrale o parziale.';
}else if((nNew||nFull)&&nNod){
eb.className='eb y';
et.innerHTML='🟡 <b>Prossimità eclisse</b><br>Luna '+(nNew?'quasi nuova':'quasi piena')+' e nodo a '+nDist.toFixed(1)+'°.<br>Lat. '+m.lat.toFixed(2)+'° — ai limiti.';
}else if(nNod){
eb.className='eb y';
et.innerHTML='🟡 Stagione eclissi attiva (nodo a '+nDist.toFixed(1)+'°), elong. '+elong.toFixed(1)+'° — fase non adatta ora.';
}else{
eb.className='eb g';
et.innerHTML='✅ <b>Nessuna eclisse</b><br>Nodo a '+nDist.toFixed(1)+'°, elong. '+elong.toFixed(1)+'° — lontano da qualsiasi condizione.';
}
drawPolar(s,m);
drawEdge(s,m);
}
setNow();
window.addEventListener('load',function(){setTimeout(calc,120)});
window.addEventListener('resize',function(){clearTimeout(window._rt);window._rt=setTimeout(calc,150)});
</script>
</body>
</html>
® Ricerca indipendente di monseppe2