[BASIC] Hoek uit coordinaten berekenen.

Pagina: 1
Acties:
  • 3.026 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Ik ben op zoek naar een algoritme om een hoek van een lijn tussen twee punten met bekende coordinaten en een andere lijn te berekenen.
In dit plaatje is a hoek die ik wil berekenen, en x1, y1, x2 en y2 zijn de gegeven coordinaten.
code:
1
2
3
4
5
6
7
 (x2,y2)b
      |\
      | \
     A|  \C
      |   \
      |____\
(x2,y1)c  B   a(x1,y1)

Ik ben zover gekomen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
'Dit is een fragment, in het volledige programma zijn x2 en y2 variabel, dus heb ik ze hier zo gelaten.
'320 = x1
'240 = y1
'X% = x2
'Y% = y2
'S% = Afstand tussen de punten

DX% = X% - 320
DY% = Y% - 240
S% = SQR(DX% ^ 2 + DY% ^ 2) 'Pythagoras
Sinus! = DY% / S%
Cosinus! = DX% / S%

Maar verder kom ik niet. |:(
Is hier een wiskundige formule voor of weet iemand misschien een library met trigonometrische functies te vinden?

Acties:
  • 0 Henk 'm!

Anoniem: 8730

Basisregeltjes in 3hoek:
CAS: cos hoek = aanliggende zijde / schuine zijde
SOS: sin hoek = overstaande zijde / schuine zijde
TOA : tg hoek = overstaande zijde / aanliggende zijde

Bereken de lengte van overstaande en aanliggende zijde, deel beiden en bereken de bgtg.

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Nog een keer dan:
code:
1
2
3
4
5
6
7
8
9
10
11
'Dit is een fragment, in het volledige programma zijn x2 en y2 variabel, dus heb ik ze hier zo gelaten.
'320 = x1
'240 = y1
'X% = x2
'Y% = y2
'S% = Afstand tussen de punten
DX% = X% - 320
DY% = Y% - 240
S% = SQR(DX% ^ 2 + DY% ^ 2) 'Pythagoras
Sinus! = DY% / S%        'SOS
Cosinus! = DX% / S%    'CAS

Ik heb de sinus en cosinus dus al, en het moet gewoonweg mogelijk zijn om daarmee de hoek te berekenen. Maar hoe? :)

Acties:
  • 0 Henk 'm!

  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
De hoek kan je berekenen door de boogtangens te nemen van de overstaande zijde gedeeld door de aanliggende.

Vb:
code:
1
Hoek = Atn((y2-y1)/(x1-x2))

Dit geeft de hoek in radialen

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Bedankt voor jullie reacties, maar ik was volgens mij niet duidelijk genoeg.
Ik zal eerst vertellen waar dit voor is, ik ben van plan om een soort 3D-engine te maken met behulp van vectoren.

Ik heb nu een 2D test voorstelling waarin een punt op een willekeurige plek wordt neergezet en waarin je de camera kan bedienen (dit wordt allemaal van boven bekeken), ik wil nu berekenen op welke X positie ik het punt zou moeten tekenen wanneer ik door het oog van de camera kijk.

De manier hiervoor is de hoek van de lijn tussen de camera positie(320,240) en het punt(X%,Y%) te vergelijken met de grenzen van het weergave scherm (FOV#).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
SCREEN 12
RANDOMIZE TIMER
Angle& = 0
Pi! = 3.141593
Viewoffset# = 45
X% = INT(RND * 639 + 1)
Y% = INT(RND * 199 + 1)

DO
'Berekenen
Rad# = Angle& * Pi! / 180
FOV# = Viewoffset# * Pi! / 180
 'Hoek van punt berekenen (hier ben ik mee bezig)
 DX% = X% - 320
 DY% = Y% - 240
 S% = SQR(DX% ^ 2 + DY% ^ 2)
 Sinus! = DY% / S%
 Cosinus! = DX% / S%

'Output
CIRCLE (320, 240), 30
LINE (320, 240)-(320 + SIN(Rad#) * 400, 240 + COS(Rad#) * 400)
LINE (320, 240)-(320 + SIN(Rad# - FOV#) * 400, 240 + COS(Rad# - FOV#) * 400), 4
LINE (320, 240)-(320 + SIN(Rad# + FOV#) * 400, 240 + COS(Rad# + FOV#) * 400), 4
PSET (X%, Y%)

'Input
Key$ = INKEY$
SELECT CASE Key$
 CASE "a"
  Angle& = Angle& + 1
  Iets% = 1
 CASE "d"
  Angle& = Angle& - 1
  Iets% = 1
 CASE "s"
  IF Viewoffset# >= 5 AND Viewoffset# < 90 THEN
   Viewoffset# = Viewoffset# + 1
   Iets% = 1
  END IF
 CASE "w"
  IF Viewoffset# > 5 AND Viewoffset# <= 90 THEN
   Viewoffset# = Viewoffset# - 1
   Iets% = 1
  END IF
 CASE CHR$(27)
  END
END SELECT

'Cleanup
IF Iets% = 1 THEN
 LINE (320, 240)-(320 + SIN(Rad#) * 400, 240 + COS(Rad#) * 400), 0
 LINE (320, 240)-(320 + SIN(Rad# - FOV#) * 400, 240 + COS(Rad# - FOV#) * 400), 0
 LINE (320, 240)-(320 + SIN(Rad# + FOV#) * 400, 240 + COS(Rad# + FOV#) * 400), 0
 Iets% = 0
END IF

LOOP

Nu heb ik dus het probleem dat ik de de hoek van de lijn tussen de camera positie en het punt niet kan berekenen en daar heb ik hulp voor nodig.

Als ik dit draaiende krijg dan is het een kwestie van een extra demensie toevoegen en ben ik klaar.

Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 18-03 14:00

Tim

Als je de sin/cos al hebt is het kwestie van sin/cos inversus ofzo te doen :)


Geen idee in welke taal je zit te proggen, maar er zal vast een funcite voor inzitten :)

Acties:
  • 0 Henk 'm!

Anoniem: 18050

Op donderdag 05 juli 2001 22:37 schreef Timpie2000 het volgende:

Geen idee in welke taal je zit te proggen, maar er zal vast een funcite voor inzitten :)
Ik heb geen verstand van BASIC maar voor Timpie ff de titel;

[BASIC] Hoek uit coordinaten berekenen.

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Het probleem is iets complexer dan dat, BASIC heeft geen inverse cosinus of sinus functie in de standaard library, daarom vroeg ik naar een library.

Dan zou ik de geinverteerde cosinus kunnen vermenigvuldigen met -1 als de sinus negatief is, en met 1 als de sinus positief of gelijk aan nul is.

De vraag is nu, heeft iemand zo'n library voor me?

edit:

Of beter nog, code om zo'n functie zelf te schrijven!


[edit2]
Code in een andere taal dan BASIC mag ook, ik vind het wel uit als het in C/C++, Pascal of PHP of iets dergelijks is... :)
[/edit2]

Acties:
  • 0 Henk 'm!

Anoniem: 28935

Inverse cosinus staat op RM's vermeld als: Cos^-1
misschien moet je cosinus dus tot de macht -1 doen?
Sorry ik ben toevallige voorbijganger. Give it a thought en als het nerges op slaat, lamazittuh :+

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 15-06 18:54

Knutselsmurf

LED's make things better

Van de inverse functies zit alleen de ATAN, of ARCTAN (= inverse tangens) bij de standaard goniofuncties. Echter met de hulp van de stelling van Pythagoras zijn de andere hoeken ook te vinden. Uiteindelijk weet je namelijk 3 lengtes, dus kan je ook 3 hoeken uitrekenen. Dan is het even uitzoeken welke 2 lengtes je in de ATAN-functie moet stoppen om de gewenste hoek te krijgen...

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Inverse cosinus staat op RM's vermeld als: Cos^-1
misschien moet je cosinus dus tot de macht -1 doen?
Sorry ik ben toevallige voorbijganger. Give it a thought en als het nerges op slaat, lamazittuh
Teup, zo'n rekenmachine heb ik ook (TI-82).
En ik heb het al uitgeprobeerd maar het geeft jammergenoeg geen resultaat.
Van de inverse functies zit alleen de ATAN, of ARCTAN (= inverse tangens) bij de standaard goniofuncties. Echter met de hulp van de stelling van Pythagoras zijn de andere hoeken ook te vinden. Uiteindelijk weet je namelijk 3 lengtes, dus kan je ook 3 hoeken uitrekenen. Dan is het even uitzoeken welke 2 lengtes je in de ATAN-functie moet stoppen om de gewenste hoek te krijgen...
Inderdaad, ATN (boogtangens) is de enige omkeerfunctie in BASIC. Maar deze kan ik niet gebruiken omdat deze een bereik (in graden) heeft van [-89,99;89,99] maar ik wil alle hoeken kunnen berekenen, dus ook die groter dan 90 tot -90 graden en daar heb ik dus de omkeerfunctie van cosinus van nodig om de methode in mijn laatste post toe te passen.

Acties:
  • 0 Henk 'm!

  • Slein
  • Registratie: September 2000
  • Laatst online: 03-07-2024

Slein

NERD

3D-engine? Basic? Check uit http://www.darkbasic.com !
Darkbasic is Basic, maar dan met ondersteuning voor directX (direct3d, wav, midi, mp3...) en erg snel en simpel.
Hadden ze dat maar eerder gemaakt :9~

-- Hi, I'm a signature virus, plz set me as your signature and help me spread. :)


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:21

Creepy

Tactical Espionage Splatterer

-89.99 tot 89.99
das dus 180 graden.. das ZAT!
als je een hoek krijgt van meer dan 180 graden dan pak je toch gewoon de andere kant van de hoek? (die dan automatisch kleiner is dan 180)

Anyway.. als je echt een 3d engine in basic wilt schrijven kan je misschien beter eerst wat aan je wiskunde doen... :) (je kan dus ZONDER die inverse sin/cos/tan die hoek zo uitrekenen hoor.. zie ook post hierboven voor die SOSCASTOA regel)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 15-06 18:54

Knutselsmurf

LED's make things better

Voor andere hoeken dan het bereik -90 tot + 90 zul je zelf aan de slag moeten. De definitie van de tangens is de overstaande zijde gedeelt door de aanliggende zijde. Deze deling zul je in de ATAN-functie moeten stoppen om de hoek eruit te krijgen. Dit betekent dat je in ieder geval moet controleren op een deling door 0. Dit komt overeen met een hoek van +/- 90 graden, afhankelijk van het teken van de lengte van de aanliggende zijde.

Ook moet je nog rekening houden met het feit dat als aanliggende en overstaande zijde allebei negatief zijn, je hetzelfde resultaat krijgt als wanneer ze beide positief zouden zijn.

Dit betekent dus dat je het beste een eigen functie kunt schrijven, die rekening houdt met delingen door 0 en met negatieve getallen enzo.

Teken maar op een stukje papier en ga na wat er uit de ATAN-functie komt in ieder kwadrant en welk resultaat je eigenlijk wilt hebben.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Op vrijdag 06 juli 2001 17:13 schreef Knutselsmurf het volgende:Voor andere hoeken dan het bereik -90 tot + 90 zul je zelf aan de slag moeten. De definitie van de tangens is de overstaande zijde gedeelt door de aanliggende zijde. Deze deling zul je in de ATAN-functie moeten stoppen om de hoek eruit te krijgen. Dit betekent dat je in ieder geval moet controleren op een deling door 0. Dit komt overeen met een hoek van +/- 90 graden, afhankelijk van het teken van de lengte van de aanliggende zijde.
Op vrijdag 06 juli 2001 16:31 schreef Creepy het volgende:
-89.99 tot 89.99
das dus 180 graden.. das ZAT!
als je een hoek krijgt van meer dan 180 graden dan pak je toch gewoon de andere kant van de hoek? (die dan automatisch kleiner is dan 180)
Oeps, ik heb jullie verkeerd geinformeerd over de boogtangens, oftewel de inverse tangens, het bereik gaat van [0,01;89,99] en [-89,99;-0,01]. Geen 180 graden dus.
Daar kan ik dus weinig mee, vooral niet als ik ook gewoon de inverse cosinus (die wel een bereik heeft van 180 graden zonder dat ik rekening hoef te houden met delingen door nul) kan gebruiken met de manier die ik boven heb uitgelegd (niet gelezen?), nu vraag ik me af wanneer de mensen nu eens stoppen met dat tangens en boogtangens gedoe, want als dat zou werken zou ik het allang gebruikt hebben, ik zei immers al dat BASIC daar wel een functie voor heeft.

Zoals ik hierboven schreef en in een vorige post heb ik de oplossing al gevonden (of hebben jullie dat soms niet gelezen?). Ik moet dus de inverse cosinus functie hebben. Zal ik maar een nieuw draadje starten genaamd: Inverse cosinus functie gevraagd.? :)

Hoewel, nu ik Knutselsmurfs oplossing nog eens bekijk zou het kunnen werken, zij het nogal omslachtig. :P
Op vrijdag 06 juli 2001 16:31 schreef Creepy het volgende:
Anyway.. als je echt een 3d engine in basic wilt schrijven kan je misschien beter eerst wat aan je wiskunde doen... :) (je kan dus ZONDER die inverse sin/cos/tan die hoek zo uitrekenen hoor.. zie ook post hierboven voor die SOSCASTOA regel)
Ik kan dus zonder de methode om een cosinus omterekenen naar een hoek... de cosinus omrekenen naar een hoek, leg jij me dat eens uit...

Als je mijn code had gelezen (drie keer gepost) had je gezien dat ik SOSCASTOA kan toepassen (dom ezelsbruggetje overigens).

Daarnaast zeg je dat ik die boogtangens functie moet gebruiken (die ik dus niet kan gebruiken) en zeg je hier opeens dat het niet nodig is.

Volgens mij ben jij diegene die nog maar eens zijn wiskunde moet overkijken. :)

edit:

Post opgelapt.

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 15-06 18:54

Knutselsmurf

LED's make things better

Ben ff aan het klooien geweest en volgens mij geldt de volgende vergelijking:

h=ACOS(A/S)=ATAN(sqrt(S^2-A^2)/A)

met h de hoek die je wilt weten, A de lengte van de aanliggende zijde , S de lengte van de schuine zijde. Ik zal eens kijken of ik de afleiding van deze vergelijking een beetje behoorlijk kan posten....
edit:
Moet ik natuurlijk geen fout maken in de formule... :P

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Bedankt voor al de replies.

Ik heb nu een oplossing...

Voor de mensen die na me komen:
http://www.mccm.aktu.nl/millennium/milc/gc/topic_48.htm

Voor mensen die te lui zijn om op die pagina te kijken :) : ARCCOS(X) = -ATN(X/SQR(-X*X+1))+PI/2

(Eigenlijk best wel stom dat ik niet meteen naar inverse cosinus heb gezocht, want op die trigonometrie sites stonden alleen maar ingewikkelde afleidingen... :) )

Acties:
  • 0 Henk 'm!

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 15-06 00:58

johnwoo

3S-GTE

Je kunt beter de goniometrische tabellen bij het initialiseren berekenen en dan in een array opslaan; tijdens het runnen is het opzoeken van een waarde in een array veeeeel sneller dan het ter plekke berekenen van de functie... (en dat dan nog een aantal keren achter elkaar)
Zeker in een taal als BASIC ga je dat verschil merken, en zoveel geheugen neemt het nu ook weer niet. Pak bijvoorbeeld 1024 of 2048 mogelijk hoeken.

Specs | Toyota MR2 Turbo


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:08
voor de info

Het bereik van die arctan gaat niet verder omdat de tangens op -1/2*pi oneindig klein is en op +1/2*pi oneindig groot. (probeer: arctan(1/2 * pi))

Dit patroon herhaalt zich telkens.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Anoniem: 20740

Wat betreft die 3D-engine: Hier staat de source van een 3D-engine in PB-DOS v3.5. Misschien heb je er wat aan. :)

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 25-04 10:44
Nogmaals bedankt voor de antwoorden.
Minne: ik zal eens kijken wat ik uit dat 3d-engine kan halen.
Pagina: 1