25. marts 2004 - 14:42Der er
7 kommentarer og 1 løsning
Beregning af 3D punkter?
Jeg skal beregne et antal punkter på en cirkelbue i 3D. Jeg har start- og slutpunkt samt centrum for cirkelbuen. Hvordan beregner jeg en række punkter på cirkelbuen?
(Jeg skal det samme med en parabel. Hvor jeg har start- og slutpunkt samt et punkt mere på parablen.)
Som jeg forstår dig har du 3 punkter: Centrum, C, og to punkter på cirklen: A og B. Skal du så beregne n ækvidistante (med samme afstand mellem sig) punkter på cirklen mellem A og B?
Det er egentlig et matematisk spørgsmål, så jeg kommer med et matematisk svar - det er mest noget vektorregning.
Først vær opmærksom på, at der er et principielt og ubehageligt problem: Hvis A, B og C ligger på den samme rette linie, så er cirklen ikke veldefineret!
Så forudsætningerne er at A, B og C ligger ikke på en ret linie, at afstand(C,A)=afstand(C,B) (cirklens radius, r) og at n>=2.
Antag i første omgang at vinklen, alpha, mellem A og B (set fra C) er mindre end 180 grader.
Lad u=vektor(CA)/r og v=vektor(CB)/r. Nu er alpha=arccos(prikprodukt(u,v)).
Herefter har vi brug for en vinkelret til u. Lad t=v-prikprodukt(u,v)*u w=t/længde(t)
Nu kan de n punkter (P_i for i=0, ..., n-1) beregnes som alpha_i = i*alpha/(n-1) P_i = C+r*(u*cos(alpha_i)+w*sin(alpha_i))
Mellem to punkter, P = (p1,p2,p3) og Q = (q1,q2,q3) på en kugle, ligger der en cirkelbue. En ret linie, som skærer disse punkter, har parameterfremstillingen:
(x,y,z) = (p1,p2,p3) + t*(r1,r2,r3) , hvor
r = (r1,r2,r3) er en retningsvektor på linien. Sættes t = 1 og (x,y,z) = (q1,q2,q3), så er linien mellem P og Q retningsvektoren selv. Retningsvektorens begyndelsespunkt er P og endepunkt er Q.
For t = 0 går vektoren CP, hvor C = (c1,c2,c3) er kuglens centrum, gennem punktet P, som er et punkt på cirkelbuen. For t = 1 går vektoren CQ gennem punktet Q, som ligeledes er et punkt på cirkelbuen. Længden af CP = CQ, som følgelig svarer til kuglens radius R.
En linie, som går gennem kuglens centrum C, går samtidig gennem et punkt på cirkelbuen, hvis og kun hvis denne linie skærer linien PQ.
Går der en linie gennem et punkt A mellem P og Q på cirkelbuen regnet fra C, så er skæringspunktets (x,y,z) koordinater for skæringen mellem linien CA og linien PQ:
(x,y,z) = (p1,p2,p3) + 0.5*(r1,r2,r3) .
For n antal punkter mellem P og Q på cirkelbuen gælder følgelig:
(x,y,z) = (p1,p2,p3) + (1 / (n + 1))*(r1,r2,r3), idet
t = 1, svarende til liniestykket PQ delt op i n + 1 antal ækvidistante liniestykker.
Med viden om et skæringspunkt mellem liniestykket CA og liniestykket PQ, kan retningsvektoren for CA bestemmes af parameterfremstillingen:
(x,y,z) = (c1,c2,c3) + s*(v1,v2,v3) .
Sættes s = 1, så er retningsvektorens koordinater:
(v1,v2,v3) = (x,y,z) – (c1,c2,c3).
For at bestemme skæringspunkt for CA med et punkt på cirkelbuen, skal retningsvektoren forskydes med parameteren s:
s = SQRT[|CP|] / SQRT[((v1)^2 + (v2)^2 + (v3)^2)] .
Skæringspunktet på cirkelbuen for den aktuelle retningsvektor findes så ved at indsætte s i parameterfremstillingen for CA.
For god ordens skyld har kuglen ligningen:
(x – c1)^2 + (y – c2)^2 + (z – c3)^2 = R^2, hvor
c1, c2 og c3 er kuglens centrum og R er kuglens radius.
"For n antal punkter mellem P og Q på cirkelbuen gælder følgelig:
(x,y,z) = (p1,p2,p3) + (1 / (n + 1))*(r1,r2,r3), idet
t = 1, svarende til liniestykket PQ delt op i n + 1 antal ækvidistante liniestykker."
ændres til:
For n antal punkter mellem P og Q på cirkelbuen gælder følgelig:
(x,y,z) = (p1,p2,p3) + (m / (n + 1))*(r1,r2,r3), idet
t = 1, svarende til liniestykket PQ delt op i n + 1 antal ækvidistante liniestykker, hvor m er en heltallig variabel, som angiver den aktuelle linie mellem punkt P og Q, og n er antallet af linier mellem P og Q.
coldplay: din løsning er ganske god, men man skal være opmærksom på at punkterne på cirkelbuen ikke bliver ækvidistante, så den er bedst hvis vinklen mellem P og Q er lille - og under alle omstændigheder skal den være under 180 grader.
En bedre løsning (også bedre end min ovenstående) ville nok være at rotere punktet P omkring cirklens centrum med en fast vinkel. Herved ville man blot skulle beregne en transformationsmatrix en gang for alle og så lave en matrix-vektormultiplikation for hvert punkt.
(jeg er enig i at Thomas har været uklædeligt tavs i denne tråd).
rrn: Det er rigtigt, at jeg har været en smule tavs, men jeg har haft en smule travlt :)
Kan du ikke lave et svar, så jeg kan give dig nogle points? Jeg har brugt din løsning, og den virker fint med lidt små justeringer, så den også virker med vinkler på over 180 grader.
Thomas: jeg er glad for at du har kunnet bruge min løsning.
(den med parablen ser værre ud, hvis punkterne skal være ækvidistante...)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.