Toon posts:

[Alg] Hoek verkrijgen uit coordinaten

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

Verwijderd

Topicstarter
Ik wil in een spel, dat ik voor school moet gaan maken, ogen van characters mee laten draaien met een vliegende banaan. Dan moet er een hoek berekend worden uit de delta_x en de delta_y, maar hoe doe ik dat?

Afbeeldingslocatie: http://home.hccnet.nl/de.graaff/hoek.gif

Ik zoek dus de formule waarmee je de hoek kan berekenen [hoek met y-as, gewoon als een compas]. Bij dit voorbeeldje zou je dus iets van 60 graden moeten krijgen. Het is mogelijk om met inverse sinus dat terug te rekenen aan de hand van de soscastoa regel, maar dat werkt maar tot 90 graden :S. Kan iemand mij helpen met dit probleem :?

  • Mark Lor
  • Registratie: Mei 2003
  • Laatst online: 04-03 09:30

Mark Lor

...

sos sin overstaand/schuin
cas cos aanliggend/schuin
toa tang overstaand/aanliggend, hiermee moet dit toch te berekenen zijn :X

[ Voor 78% gewijzigd door Mark Lor op 03-09-2003 22:51 ]


  • Rockster
  • Registratie: Juni 2002
  • Laatst online: 10:23
Mark Lor schreef op 03 september 2003 @ 22:49:
lijn x,y tot het rand van de circel is 1 cm (doh) maar je moet echter nog een van de lengte van de lijnen weten, snijpunt loodrecht tot punt loodrecht op de x-as of snijpunt tot loodrecht op de y-as dan is dit simpel met sin cos en tan uit te rekenen
Tis een cirkel, dus je weet sowieso 2 lijnen (beide 1 cm) 8)

Mitsu PUHZ-SHW112YAA + ERSC-VM2C


  • Mark Lor
  • Registratie: Mei 2003
  • Laatst online: 04-03 09:30

Mark Lor

...

kad mijn post net aangepast :P maar het is wel handig als je een rechthoekige driehoek hebt :X

Verwijderd

Topicstarter
Ja maar kijk, als je dan verder gaat dan 90 graden, dan gaat telt ie ineens weer terug van 90 naar 0. Het moet dus echt werken voor de volle 360 graden

ik zat al te denken aan sin(a) = (x / sqr(x^2+y^2)), dat werkt TOT 90 graden

[ Voor 21% gewijzigd door Verwijderd op 03-09-2003 22:55 ]


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

code:
1
angle = arctan(abs(dx/dy))

[ Voor 10% gewijzigd door Opi op 03-09-2003 22:57 ]


  • -=bas=-
  • Registratie: Oktober 2000
  • Laatst online: 22-04 02:56
Met behulp van de inverse tan/sin/cos kan je alles bepalen wat je wilt weten.
Het is niet zo dat je mbv een sinus functie hiervoor kunt gebruiken.
tan hoek = (delta_x / delta_y) dus hoek = inverse_tan(delta_x/delta_y)

Als je oogjes dan een bepaalde cirkelstraal hebben dan kan je mbv de hoek en de vaste cirkelstraal bepalen wat de x/y verschuiving moet worden.

Houd wel rekening met het feit dat programmeertalen niet altijd graden gebruiken maar ook vaak radialen.

Senile! Senile Oekaki


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 29-09 21:55

Brothar

meester

Of:
transformatie.
De positie van de banaan, ten opzichte van de positie van de toeschouwende figuur op het beeldscherm, is een bepaalde vector (x,y).
De ogen staan, ten opzichte van het middelpunt van de oogkas, in dezelfde hoek, vector (x', y').
De vector {-1 * (x', y')} , heeft dan altijd een maximale lengte, zodat het oog rust tegen de rand van de oogkas.

[ Voor 5% gewijzigd door Brothar op 03-09-2003 22:58 ]

eagle


  • Mark Lor
  • Registratie: Mei 2003
  • Laatst online: 04-03 09:30

Mark Lor

...

dat is dan ook de hoek met de y-as :) wat je misschien kunt doen (ik weet niet of dat mogelijk is met het programmeren de 4 vakken een nummer geven bv links boven nr 1 rechts boven nr 2 rechts onder nr3 links onder nr4 dan heb je nr1 is normaal nr2 = 90 antwoord nr3 = 180 + antwoord

jullie typen snel of ik sloom :) was reactie op dj_ed_x

[ Voor 10% gewijzigd door Mark Lor op 03-09-2003 22:59 ]


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 29-09 21:55

Brothar

meester

Ja, maar je hoeft dan geen goniometrie (tan ) te gebruiken.

(of dan alleen voor je labeltje)

[ Voor 31% gewijzigd door Brothar op 03-09-2003 23:01 ]

eagle


Verwijderd

Topicstarter
Ik werk nu even met graden, omdat het makkelijker voor mezelf te controleren is of het antwoord wat eruit komt wel klopt. En het praat wat makkelijker. Die inverse tanges crasht als y 0 is, maar ik heb eens een java applet gezien waarbij dit gewoon werkt. Op een labeltje stond de hoek van een bepaald punt naar je cursor pointer.

Je kan de positie van de oogjes al bepalen zonder de hoek, ik weet het, maar ik vind het nou eenmaal mooier om eerst die hoek te berekenen, en aan de hand daarvan de oogies te tekenen. De formule zal ooit nog wel eens van pas komen

[ Voor 27% gewijzigd door Verwijderd op 03-09-2003 23:00 ]


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

Verwijderd schreef op 03 september 2003 @ 22:59:
Die inverse tanges crasht als y 0 is.
Dit klopt inderdaad; bij y = 0 is de arctan (inverse tangens) niet gedefinieerd; dit is bij 90 mod(180) het geval.

Verwijderd

Topicstarter
Maak een form1, zet autoredraw aan en paste dit even:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Form_Load()
    Form1.DrawWidth = 3
    Form1.Circle (64, 64), 15
    Form1.Circle (96, 64), 15
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
    Dim dx As Integer, dy As Integer
    Form1.Cls
    Form1.Circle (64, 64), 15
    Form1.Circle (96, 64), 15
    
    dx = x - 64: dy = Y - 64
    lengte = Sqr(dx ^ 2 + dy ^ 2)
    Form1.Circle (64 + (dx / lengte) * 10, 64 + (dy / lengte) * 10), 3
    
    dx = x - 96: dy = Y - 64
    lengte = Sqr(dx ^ 2 + dy ^ 2)
    Form1.Circle (96 + (dx / lengte) * 10, 64 + (dy / lengte) * 10), 3
End Sub

Helaas komt de hoek zelf niet voor in deze code. Die wil ik echter WEL weten omdat ik dat vast nog wel eens tegen zal komen

ps. owja hij crasht als je de cursor pcies in het midden van een oogie zet, maar dat is logisch

[ Voor 7% gewijzigd door Verwijderd op 03-09-2003 23:04 ]


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 29-09 21:55

Brothar

meester

tan(gevraagde hoek) = (dy / dx)
dus toevoegen ( klopt toch ?):

if dy <>0
hoek=arctan(dy/dx)
else
hoek=180 graden
endif
(N.B. dy = overstaande, dx = aanliggende rechthoekszijde;
dat begrijp ik althans).

[ Voor 30% gewijzigd door Brothar op 03-09-2003 23:15 ]

eagle


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-12 21:53

.oisyn

Moderator Devschuur®

Demotivational Speaker

veel programmeertalen kennen een speciale inverse tangens functie met 2 argumenten. In C heet die atan2, die, als je x en y meegeeft, gewoon de juiste hoek uitrekent, en verder rekening houdt met dingen als x = 0 en y = 0. Verder retourneert atan () altijd waarden tussen -pi/2 en pi/2, dus de linkerhelft van de cirkel wordt niet gedekt (maar deze kun je wel uit de waarden van x en y halen)

In principe komt het hierop neer:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
float atan2 (float y, float x)
{
    if (x == 0)  // om deling door 0 te voorkomen
    {
        if (y > 0) // recht omhoog
            return PI / 2;
        if (y < 0) // recht naar beneden
            return -PI / 2;
    }

    if (x >= 0) // rechterhelft van de cirkel, atan (y / x) geeft een goed resultaat
        return atan (y / x);

    // rechterhelft, dus PI erbij optellen
    return atan (y / x) + PI;
}


en het is dus y / x, niet x / y (want: overstaande / aanliggende, en de hoek bevindt zich in het middelpunt, dus y is de overstaande, en x is de aanliggende ;))

.edit: met graden moet je dus PI vervangen door 180 :)

[ Voor 4% gewijzigd door .oisyn op 03-09-2003 23:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
    If dx <> 0 Then
        Label1.Caption = Atn(dy / dx) / PI * 180 + IIf(dx < 0, 270, 90)
    Else
        If dy > 0 Then
            Label1.Caption = 180
        Else
            Label1.Caption = 0
        End If
    End If

Zo werkt ie

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...ook effe de scalemode op pixels zetten dan...anders doet 'ie niks...
En waarom deed je dat niet gewoon effe in de form_load? >:)
Visual Basic:
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
Option Explicit

Private Sub Form_Load()
    Me.AutoRedraw = True
    Me.ScaleMode = vbPixels
    Me.DrawWidth = 3
    Me.Circle (64, 64), 15
    Me.Circle (96, 64), 15
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
    Dim dx As Integer, dy As Integer
    Dim lengte As Double
    
    On Error Resume Next
    
    Me.Cls
    Me.Circle (64, 64), 15
    Me.Circle (96, 64), 15
    
    dx = x - 64: dy = Y - 64
    lengte = Sqr(dx ^ 2 + dy ^ 2)
    Me.Circle (64 + (dx / lengte) * 10, 64 + (dy / lengte) * 10), 3
    
    dx = x - 96: dy = Y - 64
    lengte = Sqr(dx ^ 2 + dy ^ 2)
    Me.Circle (96 + (dx / lengte) * 10, 64 + (dy / lengte) * 10), 3
End Sub


verder crasht deze niet op een overflow (dankzijn on error resume next }) ) en werkt 'ie ook met option explicit })

...Maar verder een leuk voorbeeldje! Ik heb er effe mee gespeeld in ieder geval :o

[ Voor 13% gewijzigd door RobIII op 03-09-2003 23:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

.oisyn schreef op 03 september 2003 @ 23:14:
en het is dus y / x, niet x / y (want: overstaande / aanliggende, en de hoek bevindt zich in het middelpunt, dus y is de overstaande, en x is de aanliggende ;))
De hoek tussen de lijn en de y-as is toch gewenst? In dat geval is de y-as (de y-coordinaat of dy) de aanliggende.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-12 21:53

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ho idd, ik zie het

Beetje vreemd, want meestal is het bij hoek=0 naar rechts, en is de hoek in positieve richting een draaiing tegen de klok in :)

(denk ook aan x=cos(a) en y=sin(a))

[ Voor 12% gewijzigd door .oisyn op 03-09-2003 23:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Jah, gewoon het compas principe [zie opening]

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Even een geheugensteuntje goniometrie

We hebben tekenen een cirkel met straal '1', en noemen deze de eenheidscirkel.
Afbeeldingslocatie: http://gerard.yoursite.nl/got/gonio/gonio.gif

waar:
O is de overstaande zijde van hoek α
A is de aanliggende zijde van hoek α
S is de hypothenusa of schuine zijde
De hoek tussen O en A is 90°

sin(α) = O/S
cos(α) = A/S
tan(α) = O/A
ezelsbruggetje: sos, cas, toa

waarbij in de eenheidscirkel S = 1 geeft:

sin(α) = O/1 = O
cos(α) = A/1 = A
tan(α) = O/A = sin(α) / cos(α)

Verder mag je het volgende zeggen wanneer de straal van de cirkel groter wordt, waarbij we even r als straal van de cirkel nemen:

O = sin(α) · r
A = cos(α) · r

omdat:
sin(α) = O/1
cos(α) = A/1
wanneer r = S = 1, dus

sin(α) = O/r
cos(α) = A/r

Wanneer we bij beide vergelijkingen beide kanten vermenigvuldigen met 'r' krijgen we dus:

O = r · sin(α)
A = r · cos(α)

Tot zover de achtergrondinfo.

In dit geval zijn O en A bekend, en willen we de hoek weten. Als we O en A in vullen in de vergelijking
tan(α) = O / A
nemen we aan beide kanten de inverse tangens om aan de linkerkant α over te houden:

α = tan-1(O/A);

maar, de flauwigheid is dat je de hoek wilt weten vanaf de y-as. Dan moet je dus de gehele eenheidscirkel 1 kwartslag naar links draaien. Als je dat doet, en het even voor jezelf op papier tekent, zal je zien dat:

O = -x
en
A = y

Eveneens willen we dat de hoek met de klok meegaat, ipv tegen de klok in.

Als we die informatie verwerken in de formule, dan zie we dat:

α = - tan-1(-x/y)

[ Voor 11% gewijzigd door drm op 04-09-2003 10:22 ]

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


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

drm schreef op 04 September 2003 @ 00:08:
maar, de flauwigheid is dat je de hoek wilt weten vanaf de y-as. Dan moet je dus de gehele eenheidscirkel 1 kwartslag naar links draaien.
*kuch* men spiegeld in de lijn y = x. :)
Verder is het een mooie duidelijke, W&L-waardige, uitleg.
offtopic:
edit je post anders maar en trash deze ;)

[ Voor 8% gewijzigd door Opi op 04-09-2003 00:12 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

OpifexMaximus:
*kuch* men spiegeld in de lijn y = x. :)
offtopic:
*kuch* Men spiegelt ... :+

good call ;)
offtopic:
edit je post anders maar en trash deze ;)
Dat zou flauw zijn :)

edit:



Overigens, dit is wel leuk om 't even te illustreren:

f(x) = tan(x) heeft een verticale asymptoot wanneer x=90 v x=270.
g(x) = cos(x) geeft 0 wanneer x = 90 v x=270

als we weten dat

tan(x) = sin(x)/cos(x), zien we dus dat er door 0 gedeeld gaat worden op het wanneer x = 90 v x=270; hence de asymptoot. (tan(x) = sin(x)/0 = oneindig)
Afbeeldingslocatie: http://gerard.yoursite.nl/got/gonio/gonio2.gif
tan(x)
cos(x)
sin(x)


Dit is ook logisch, want als je voor α in de eenheidscirkel een rechte hoek zou nemen, zouden O en S elkaar in het oneindige snijden, hetgeen ook de definitie voor evenwijdige lijnen is :)

[ Voor 62% gewijzigd door drm op 04-09-2003 00:37 ]

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

Pagina: 1