Toon posts:

[alg/Director] Van een tangens naar een hoek. *

Pagina: 1
Acties:

Verwijderd

Topicstarter
...ofwel 'Hoe doet een 'echte' programmeur zoiets?'

Ik heb getwijfeld of dit een wiskunde vraag voor l&w, een Director vraag voor w&g of een programmeervraag voor p&w moest worden. Toch maar voor het laatste gekozen, ondanks het feit dat ik stiekum in <fluister>director lingo</fluister> bezig ben en dat hier natuurlijk een beetje vloeken in de kerk is ;). Daarom heb ik de code maar ff een beetje omgebouwd naar C notatie.

Genoeg inleiding, komt ie:

Voor een grafisch programmaatje (spelletje) wil ik de afstand en hoek in graden berekenen waarmee de muiscursor staat ten opzichte van een bepaald punt.
De afstand is geen punt, daar hebben we Pythagoras voor. De hoek is op zich ook niet zo moeilijk, gelukkig heeft mijn wiskundeleraar me ooit het zogenaamde 'soscasTOA' ezelsbruggetje geleerd. Ik kan dus, door de Overstaande zijde te delen door de Aanliggende, de Tangens vinden, en dan via de arctangens naar radialen, en zo naar graden. Even een stukje ASCII-art ter verduidelijking:
code:
1
2
3
4
5
6
7
8
    Muiscursor --> . 
             |
             |  <-- 'aanliggende zijde' 
             |   (Y-afstand tussen de 2 punten)
 Puntje -->  ._____|  
             ^
             |________'overstaande zijde' 
                   (X-afstand tussen de 2 punten)

Maar de cursor kan overal staan ten opzichte van dit punt, links rechts boven en onder. Waneer ik gewoon de X-afstand door de Y-afstand deel, gaat het alleen goed als de cursor in het zogenaamde '1e kwadrant' zit, zoals in het voorbeeld. Dezelfde berekening gaat fout als een van de waarden, of allebei, negatief worden.

Mijn oplossing was om eerst met een reeks if/then's (of een switch/case, whatever) te testen in welk kwadrant de muis zit, en vervolgens de negatieve waarden eruit te filteren. Dan krijg ik weer het probleem dat ik in ieder kwadrant een aantal graden tussen 0 en 90 terugkrijg, en dus tel ik er bij ieder kwadrant weer wat graden bij op (0, 90, 180, of 270). Dat levert ongeveer zoiets op:
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
if (afstand_X > 0)
{
   // rechterhelft
   if (afstand_Y > 0)
   {
     // eerste kwadrant
     // bereken tangens van hoek
     hoek_tangens = afstand_X / afstand_Y
     // bereken hoek in graden
     hoek_graden = atan(hoek_tangens) / (PI / 180)
   }
   if (afstand_Y < 0)
   {
      // vierde kwadrant
      // maak y positief, bereken tangens van hoek
      afstand_Y = abs(afstand_Y)
      hoek_tangens = afstand_X / afstand_Y
      // bereken hoek in graden
      hoek_graden = atan(hoek_tangens) / (PI / 180)
      // en tel er nog wat bij op, vierde kwadrant!!
      hoek_graden = hoek_graden + 270
   }

... En dan nog zo'n lap voor de linkerhelft, 2e en 3e kwadrant.

Dit werkt perfect, maar ziet er natuurlijk niet uit. :)
Mijn vraag moge duidelijk zijn:
Ik heb het vermoeden dat er nu een aantal echte programmeurs beginnen te :'( of te :r, want zelfs ik begrijp dat er een kortere methode moet zijn om alleen maar zo'n lullig hoekie te berekenen. Ik heb al gezocht naar meer standaard algoritmetjes voor dit soort problemen, maar de Trigonometry problem solver kon me ook niet verder helpen. (Of mischien ook wel, maar ik snapte d'r geen reet van :) )


(+ even een kleine spelfout-edit)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Java en C++ kennen een Math Class die zulke berekeningen voor je kan uitvoeren

[edit]Hmmmz sorry, zie nu pas dat je met een andere taal bezig bent. Zal het ff goed lezen (nogmaals sorry)

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
In pricipe heeft de arctan functie een bereik van -1/2*Pi tot 1/2*Pi, dus dat zou al het 1ste en 4de kwadrant voor z'n rekening nemen. (arctan van iets negatiefs ligt dan in het 4de kwadrant.) Vervolgens hoef je alleen nog te kijken of het punt links of recht van de oorsprong ligt om er al dan niet Pi bij op te tellen. (Links is +Pi, rechts niet) Wat je dan overhoudt moet je omzetten naar graden, waarbij je eventueel eerst 2*Pi bij je hoek optelt om een positieve waarde te krijgen.

Onder een beetje gevalsonderscheid kom je dus volgens mij niet uit. Je kunt het misschien ook wel in 1 expressie zetten, maar of het dan nog leesbaar is???

He who knows only his own side of the case knows little of that.


Verwijderd

Topicstarter
Glimi_ie: Okee, toch bedankt. Ik vraag me dus af hoe de mensen die zo'n Math Class schrijven zo'n probleem zouden aanpakken :)

RickN: Ah, ik kan inderdaad eens kijken of ik een van de twee kwadrant-tests eruit kan halen op die manier. De methode die ik nu gebruik werkt op zich prima, maar ik had gehoopt dat ik mischien iets onnozels over het hoofd had gezien, en dat het allemaal in een regeltje kan.
Hoe langer ik erover nadenk, hoe zekerder ik ervan wordt dat dat idd niet kan en dat je toch een beetje onderscheid moet maken tussen de verschillende gevallen. In ieder geval bedankt voor het meedenken!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Atari_Junkie: director wordt meestal in W&G besproken maar ik laat um nog ff hier staan
mocht het hier nix worden icq/SU dan ff dan moven we hem alsnog :)
<edit> lezen is een vak: dat stond er dus al |:( iig het aanbod staat :P

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Okee, bedankt voor het aanbod. 'T is inderdaad director, maar het principe is natuurlijk voor iedere taal relevant.

(ik dacht eigenlijk dat men in w&g direct zou zeggen 'Wat zeur je nou, 't werrukt toch?', terwijl men in p&w wat meer gewend zou zijn aan dingen die wel werken, maar veel mooier moeten kunnen) :)

't is maar een vooroordeeltje...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Atari_Junkie:
(ik dacht eigenlijk dat men in w&g direct zou zeggen 'Wat zeur je nou, 't werrukt toch?', terwijl men in p&w wat meer gewend zou zijn aan dingen die wel werken, maar veel mooier moeten kunnen) :)

't is maar een vooroordeeltje...
hmm, ben zelfs bang dat je gelijk hebt :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1