From eb0a2ec2ef80a2a8ce9b4baa1ae5af29f7c6fe0b Mon Sep 17 00:00:00 2001 From: teahubxyz Date: Fri, 23 Oct 2026 20:22:32 +0000 Subject: [PATCH] Overlays: fit the trefoil on the right point, and add the outer yantra (lotus rings, bhupura) The lobe-meeting point is the image of the triple point where the T4 apex sits on the T6 base, not the T0 apex. Outer layer adds the 1, 1.2, 1.4, 1.5 circles, the 8 and 16 petals and the bhupura square with its four gates, all carried through both inversions. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01161aC97vUnBnyZRBGyJeHy --- overlay/index.html | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/overlay/index.html b/overlay/index.html index aeef7a5..49822c6 100644 --- a/overlay/index.html +++ b/overlay/index.html @@ -40,6 +40,7 @@ input[type=range]{width:100%;accent-color:var(--fit)} +
@@ -65,10 +66,15 @@ function seg(a,b,n=500){const o=[];for(let i=0;i<=n;i++){const t=i/n;o.push([a[0 const sides=[];T.forEach(([lx,by,ay,rx,ty])=>{const A=P(lx,by),B=P(150,ay),C=P(rx,by);[[A,B],[B,C],[C,A]].forEach(([a,b])=>sides.push({up:!!ty,pts:seg(a,b)}))}); // Fit: send the outer downward triangle's vertices (where two outer lobes meet) onto the // side midpoints of the outer upward triangle, which lie on the same three rays: rho^2 = |V||M|. -const V0=P(150,250), M1=P(150,174.24660560764943); +const V0=P(150,160.66014976539617), M1=P(150,174.24660560764943); +// outer yantra: lotus rings, petals, bhupura (square with four gates), in yantra units (rim = 1) +const circ=(r,n=360)=>Array.from({length:n+1},(_,i)=>{const a=i/n*Math.PI*2;return[r*Math.cos(a),r*Math.sin(a)]}); +function petals(r0,r1,k){const o=[];for(let i=0;icorners.push([x*c-y*s,x*s+y*c]))}corners.push(corners[0]);const o=[];for(let i=0;i{const r=p[0]*p[0]+p[1]*p[1];return r<1e-12?null:[r2*p[0]/r,r2*p[1]/r]}; -let L={orig:true,unit:false,fit:true},rho=RHO_FIT,zoom=1,pan=[0,0]; +let L={orig:true,unit:false,fit:true,outer:true},rho=RHO_FIT,zoom=1,pan=[0,0]; const cv=document.getElementById('c'),ctx=cv.getContext('2d'); function size(){const d=Math.min(devicePixelRatio,2);cv.width=innerWidth*d;cv.height=innerHeight*d;ctx.setTransform(d,0,0,d,0,0);draw()} function draw(){ @@ -77,18 +83,19 @@ function draw(){ const X=p=>cx+p[0]*s,Y=p=>cy-p[1]*s; const ring=(r,c)=>{ctx.strokeStyle=c;ctx.globalAlpha=.8;ctx.lineWidth=1;ctx.setLineDash([4,4]);ctx.beginPath();ctx.arc(cx,cy,r*s,0,Math.PI*2);ctx.stroke();ctx.setLineDash([]);ctx.globalAlpha=1}; const path=(pts,c,a,lw)=>{ctx.strokeStyle=c;ctx.globalAlpha=a;ctx.lineWidth=lw;ctx.beginPath();let pen=false;for(const p of pts){if(!p||Math.abs(p[0])>200||Math.abs(p[1])>200){pen=false;continue}pen?ctx.lineTo(X(p),Y(p)):ctx.moveTo(X(p),Y(p));pen=true}ctx.stroke();ctx.globalAlpha=1}; - if(L.unit){ring(1,col.ring);sides.forEach(sd=>path(sd.pts.map(p=>inv(p,1)),col.ring,.7,1.1))} - if(L.fit){ring(rho,col.fit);sides.forEach(sd=>path(sd.pts.map(p=>inv(p,rho*rho)),col.fit,.85,1.2))} - if(L.orig)sides.forEach(sd=>path(sd.pts,sd.up?col.up:col.down,1,1.3)); + const O=L.outer?OUTER:[]; + if(L.unit){ring(1,col.ring);sides.forEach(sd=>path(sd.pts.map(p=>inv(p,1)),col.ring,.7,1.1));O.forEach(o=>path(o.map(p=>inv(p,1)),col.ring,.4,1))} + if(L.fit){ring(rho,col.fit);sides.forEach(sd=>path(sd.pts.map(p=>inv(p,rho*rho)),col.fit,.85,1.2));O.forEach(o=>path(o.map(p=>inv(p,rho*rho)),col.fit,.45,1))} + if(L.orig){sides.forEach(sd=>path(sd.pts,sd.up?col.up:col.down,1,1.3));O.forEach(o=>path(o,col.fg,.45,1));path(circ(1),col.fg,.6,1)} if(L.fit&&Math.abs(rho-RHO_FIT)<1e-3){ctx.fillStyle=col.fit;const A=Math.atan2(M1[1],M1[0]),m=Math.hypot(...M1);for(let k=0;k<3;k++){const a=A+k*2*Math.PI/3;ctx.beginPath();ctx.arc(X([m*Math.cos(a),0]),Y([0,m*Math.sin(a)]),3.5,0,7);ctx.fill()}} ctx.fillStyle=col.bindu;ctx.beginPath();ctx.arc(cx,cy,2.4,0,Math.PI*2);ctx.fill(); document.getElementById('rv').textContent=rho.toFixed(4); document.getElementById('note').textContent= 'Yantra in gold and pink; its inversion in the rim (ρ = 1) in violet; its inversion in a circle of radius ρ in teal. '+ - (Math.abs(rho-RHO_FIT)<1e-3?`Fit: ρ = ${RHO_FIT.toFixed(4)} sends the points where two outer lobes meet onto the side midpoints of the outer upward triangle (teal dots).`:'Fit trefoil snaps ρ so the lobe meeting points land on the outer triangle’s side midpoints.'); + (Math.abs(rho-RHO_FIT)<1e-3?`Fit: ρ = ${RHO_FIT.toFixed(4)}. Two big lobes and one inner lobe meet at the image of a triple point (the T4 apex on the T6 base); this ρ lands it on the side midpoints of the outer upward triangle (teal dots).`:'Fit trefoil snaps ρ so the lobe meeting points land on the outer triangle’s side midpoints.'); } const $=id=>document.getElementById(id); -['orig','unit','fit'].forEach(k=>$('l-'+k).onclick=e=>{L[k]=!L[k];e.currentTarget.setAttribute('aria-pressed',L[k]);draw()}); +['orig','unit','fit','outer'].forEach(k=>$('l-'+k).onclick=e=>{L[k]=!L[k];e.currentTarget.setAttribute('aria-pressed',L[k]);draw()}); $('rho').oninput=e=>{rho=Math.pow(10,+e.target.value);draw()}; $('snap').onclick=()=>{rho=RHO_FIT;$('rho').value=Math.log10(rho);if(!L.fit){L.fit=true;$('l-fit').setAttribute('aria-pressed','true')}draw()}; $('rho').value=Math.log10(RHO_FIT);