Dati 3 punti A,B,C determiniamo il centro Q della circonferenza passante per essi.
Consideriamo il caso semplificato 2D con A,C posti simmetricamente rispetto l’asse y.
Sia M l’ intersezione con y del segmento AC, sia D il punto medio del segmento BC, sia N la sua proiezione su y, mentre H sia il piede dell’altezza su AC del triangolo ABC. Vogliamo trovare il valore ? di NQ. Chiamiamo h la distanza BH.
Dalla similitudine di NQD e HCB risulta:
NQ/DN= HC/BH da cui: ?=(xb+xc)/2*(xc-xb)/h
Che ci fornisce la distanza dq=MQ del centro Q dalla corda AB:
dq= ? – h/2=( (xb+xc) *(xc-xb)/h – h )/2 (1)
Posto:
lc= lunghezza corda AC
lb= proiezione su corda segmento CB
la= proiezione su corda segmento AB
h= altezza arco
la (1) si può riscrivere:
dq= ( lb*(lc-lb)/h – h )/2= ( lb*la/h – h )/2= ( la*(lc-la)/h – h )/2
Nel caso in cui B appartenga ad y (triangolo ABC isoscele) la formula si semplifica:
dq= ( ( lc/2)^2 /h – h )/2 ! infatti la=lb=lc/2=semicorda
Considerando i vettori risulta:
lc=mod(C-A)
la=(B-A)*(C-A)/lc ! prodotto scalare
H=(A-O)+(C-A) /lc*la
h=mod(H-B)
M=(A-O)/2 +(C-O)/2
Q=(M-O)+(H-B)/h*dq
Traducendo in termini analitici:
lc= sqr( (cx-ax)^2+(cy-ay)^2+ (cz-az)^2 )
la= ( (bx-ax)*(cx-ax)+(by-ay)*(cy-ay)+(bz-az)*(cz-az) )/lc
hx= ax+(cx-ax) /lc*la
hy= ay+(cy-ay) /lc*la
hz= az+(cz-az) /lc*la
h= sqr( (hx-bx)^2+(hy-by)^2+ (hz-bz)^2 )
dq= (la*(lc-la)/h-h)/2
mx=(ax+cx)/2
my=(ay+cy)/2
mz=(az+cz)/2
qx=mx+(hx-bx)/h*dq
qy=my+(hy-by)/h*dq
qz=mz+(hz-bz)/h*dq
Ovvero:
h= sqr((ax-bx+(cx-ax)*la/lc)^2+(ay-by+(cy-ay)*la/lc)^2+(az-bz+(cz-az)*la/lc)^2)
Risulta:
ax-bx+(cx-ax)*la/lc =
ax-bx+(cx-ax)*((bx-ax)*(cx-ax)+(by-ay)*(cy-ay)+(bz-az)*(cz-az))/lc^2=
((ax-bx)*lc^2+(cx-ax)*((bx-ax)*(cx-ax)+(by-ay)*(cy-ay)+(bz-az)*(cz-az))/lc^2=
((ax-bx)*((cx-ax)^2+(cy-ay)^2+(cz-az)^2)+(cx-ax)*((bx-ax)*(cx-ax)+(by-ay)*(cy-ay)+(bz-az)*(cz-az))/lc^2
Risulta ancora:
(ax-bx)*(cx-ax)^2+(ax-bx)*(cy-ay)^2+(ax-bx)*(cz-az)^2+
(bx-ax)*(cx-ax)^2+(cx-ax)*(by-ay)*(cy-ay)+(cx-ax)*(bz-az)*(cz-az)=
(ax-bx)*(cy-ay)^2+(ax-bx)*(cz-az)^2+(cx-ax)*(by-ay)*(cy-ay)+(cx-ax)*(bz-az)*(cz-az)=
((ax-bx)*(cz-az)+(cx-ax)*(bz-az))*(cz-az)+((ax-bx)*(cy-ay)+(cx-ax)*(by-ay))*(cy-ay)
posto:
abc=((ax-bx)*(cz-az)+(cx-ax)*(bz-az))*(cz-az)+((ax-bx)*(cy-ay)+(cx-ax)*(by-ay))*(cy-ay)
ax-bx+(cx-ax)*la/lc =abc/lc^2
per simmetria:
bca=((ay-by)*(cx-ax)+(cy-ay)*(bx-ax))*(cx-ax)+((ay-by)*(cz-az)+(cy-ay)*(bz-az))*(cz-az)
ay-by+(cy-ay)*la/lc =bca/lc^2
cab=((az-bz)*(cy-ay)+(cz-az)*(by-ay))*(cy-ay)+((az-bz)*(cx-ax)+(cz-az)*(bx-ax))*(cx-ax)
az-bz+(cz-az)*la/lc =cab/lc^2
dunque:
h= sqr((abc/lc^2)^2+(bca/lc^2)^2+(cab/lc^2)^2)
In conclusione abbiamo la formula ricercata:
*******************************
!3D determinare la circonferenza per A,B,C
ax=
ay=
az= !estremo A
bx=
by=
bz= !interno arco B
cx=
cy=
cz= !estremo C
abc=((ax-bx)*(cz-az)+(cx-ax)*(bz-az))*(cz-az)+((ax-bx)*(cy-ay)+(cx-ax)*(by-ay))*(cy-ay)
bca=((ay-by)*(cx-ax)+(cy-ay)*(bx-ax))*(cx-ax)+((ay-by)*(cz-az)+(cy-ay)*(bz-az))*(cz-az)
cab=((az-bz)*(cy-ay)+(cz-az)*(by-ay))*(cy-ay)+((az-bz)*(cx-ax)+(cz-az)*(bx-ax))*(cx-ax)
lc= sqr( (cx-ax)^2+(cy-ay)^2+ (cz-az)^2 )
h= sqr(abc^2+bca^2+cab^2)/lc^2 !altezza arco ABC
la= ( (bx-ax)*(cx-ax)+(by-ay)*(cy-ay)+(bz-az)*(cz-az) )/lc
dq= (la*(lc-la)/h-h)/2 !distanza centro Q da corda ACqx=(ax+cx)/2+(hx-bx)/h*dq
qy=(ay+cy)/2+(hy-by)/h*dq
qz=(az+cz)/2+(hz-bz)/h*dq !coordinate centro Q
ra=sqr((cx-qx)^2+(cy-qy)^2+(cz-qz)^2) !raggio crf
anq=2*acs(dq/ra) !angolo al centro
*******************************
Eliminando la parte in z otteniamo il caso bidimensionale:
abc=((ax-bx)*(cy-ay)+(cx-ax)*(by-ay))*(cy-ay)
bca=((ay-by)*(cx-ax)+(cy-ay)*(bx-ax))*(cx-ax)
lc= sqr( (cx-ax)^2+(cy-ay)^2)
h= sqr(abc^2+bca^2)/lc^2 !altezza arco ABC
la= ( (bx-ax)*(cx-ax)+(by-ay)*(cy-ay) )/lc
dq= (la*(lc-la)/h-h)/2 !distanza centro Q da corda AC
qx=(ax+cx)/2+(hx-bx)/h*dq
qy=(ay+cy)/2+(hy-by)/h*dq !coordinate centro Q
ra=sqr((cx-qx)^2+(cy-qy)^2) !raggio crf
Tuttavia il caso bidimensionale si può ottenere direttamente, senza necessità di semplificare la formula:
lc= sqr((cx-ax)^2+(cy-ay)^2) !corda AC
mx=(ax+cx)/2
my=(ay+cy)/2 !punto medio corda di riferimento AC
nx=-(ay-cy)/lc
ny= (ax-cx)/lc !versore ortogonale ad AC
la=((bx-ax)*(cx-ax)+(by-ay)*(cy-ay))/lc !proiezione corda AB su AC
hx= ax+(cx-ax) /lc*la
hy= ay+(cy-ay) /lc*la !H piede altezza da B su AC
h=sqr((bx-hx)^2+(by-hy)^2) !altezza arco=HB
dq=(la*( lc-la )/h-h)/2
qx=mx+nx*dq
qy=my+ny*dq !coordinate centro
Condensando la formula si ha:
*******************************
!2D determinare la circonferenza per A,B,C
ax=
ay= !estremo A
bx=
by= !interno arco B
cx=
cy= !estremo C
lc= sqr((cx-ax)^2+(cy-ay)^2) !corda AC
la=((bx-ax)*(cx-ax)+(by-ay)*(cy-ay))/lc !proiezione corda AB su AC
hx= ax+(cx-ax)*la /lc
hy= ay+(cy-ay)*la /lc !H piede altezza da B su AC
h=sqr((hx-bx)^2+(hy-by)^2) !altezza arco=HB
dq=(la*(lc-la)/h-h)/2 !distanza centro Q da corda AC
qx=(ax+cx)/2+(cy-ay)/lc*dq
qy=(ay+cy)/2+(ax-cx)/lc*dq !coordinate centro
ra= sqr((cx-qx)^2+(cy-qy)^2) !raggio
anq=2*acs(dq/ra) !angolo al centro
******************************
La formula può essere adattata al caso in cui sia data la corda e l’altezza dell’arco su questa:
!2D determinare la circonferenza di corda AC con altezza corda h:
ax=
ay= !estremo A
cx=
cy= !estremo C
h=altezza corda
lc= sqr((cx-ax)^2+(cy-ay)^2) !misura corda AC
dq= ( (lc/2)^2/h - h )/2 !distanza da centro Q a corda AC
qx=(ax+cx)/2+(cy-ay)/lc*dq
qy=(ay+cy)/2+(ax-cx)/lc*dq !coordinate centro
ra= sqr((cx-qx)^2+(cy-qy)^2) !raggio
anq=2*acs(dq/ra) !angolo al centro
******************************
Queste ultime formule possono essere utili per disegnare curve utilizzando i valori di stato, che richiedono il centro dell’arco o il suo valore angolare.