Avatar billede thomas_fogh Nybegynder
25. marts 2004 - 14:42 Der 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.)
Avatar billede segmose Nybegynder
25. marts 2004 - 16:59 #1
Mulig løsningsmetode.
Udregn vinklerne fra centrum til start og til slut.

find vinkel "forøgelse" for hver punkt i imellem start og slut.
for(i = 0; i < antalpunkter; i++) {
  Beregn3Dpunkt
}

du må have en formel samling hvor du kan slå op vinkel beregning mellem 2 rumlige koordinater. Samt beregne et 3D punkt ud fra 2 rumlige vinkler.
Avatar billede rrn Nybegynder
26. marts 2004 - 16:37 #2
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))

Sig til hvis noget er uklart.
Avatar billede coldplay Nybegynder
02. april 2004 - 12:54 #3
Beregning af punkter på cirkelbue

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.
Avatar billede coldplay Nybegynder
02. april 2004 - 22:34 #4
For de interesserede:

"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.
Avatar billede coldplay Nybegynder
03. april 2004 - 23:15 #5
Der er behov for endnu en korrektion. Hvis du vil have et taleksempel, som naturligvis inkluderer denne korrektion, så send en kommentar.

Ellers synes jeg, du skulle lukke spørgsmålet og tage dine point tilbage. Det har du jo gjort en gang før ;)
Avatar billede rrn Nybegynder
13. april 2004 - 09:49 #6
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).
Avatar billede thomas_fogh Nybegynder
13. april 2004 - 15:53 #7
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.

Tak for hjælpen!
Avatar billede rrn Nybegynder
14. april 2004 - 16:08 #8
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...)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester