...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:
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:
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
, 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)
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
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
(+ even een kleine spelfout-edit)