Springen naar inhoud

Goniometrie vraagstuk


  • Log in om te kunnen reageren

#1

mrfreeze

    mrfreeze


  • 0 - 25 berichten
  • 7 berichten
  • Gebruiker

Geplaatst op 06 juli 2010 - 11:44

Hoi,

Ik zit met het volgende vraagstuk.

Ik heb een oppervlakte van 600 x 600.
Als je vanaf een bepaald punt in dit oppervlakte (bv. 250,400) een lijn trekt in een bepaalde richting (bv. 100 graden), wil ik graag berekenen op welk punt deze lijn de grens van het oppervlak snijdt.
Je hebt dus deze gegevens: x, y en richting.

Ik heb al enorm zitten stoeien met tangens en meer van die grappen, maar ik kom er even niet meer uit... Hopelijk kan iemand me helpen :-)

Alvast bedankt!

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 06 juli 2010 - 11:48

Verplaatst naar huiswerk.
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#3

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 06 juli 2010 - 12:08

Kan je misschien om te beginnen al eens een tekening maken en daar een assenstelsel en een willekeurig punt met coŲrdinaten (x,y) op aanduiden en dan een lijn door dat punt met helling alfa?


Edit: wat is de context van dit vraagstuk, want zoals je zelf misschien al ziet kan je dat oppervlak door verschillende zijdes snijden, afhankelijk van de positie en de heling?

Veranderd door Xenion, 06 juli 2010 - 12:11


#4

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 06 juli 2010 - 12:12

Maak eens een situatieschets? Je zult dan zien dat je een bepaalde driehoek krijgt. aan de hand van deze driehoek kun je berekenen waar je het gebied van 600x600 verlaat.

Je hebt nog meer gegevens dan die: x, y, hoek, grootte van het gebied (600x600). Overigens vermoed ik niet dat je hier met ťťn berekening uit gaat komen. Sowieso zul je voor de x en de y allebei een aparte berekening hebben. Maar daarnaast heb je er ook mee te maken dat je de voorwaarde moet checken of het door de bovenkant of door de zijkant de grens gesneden gaat worden.

#5

mrfreeze

    mrfreeze


  • 0 - 25 berichten
  • 7 berichten
  • Gebruiker

Geplaatst op 06 juli 2010 - 12:44

Dat zijn dus ook precies de problemen waar ik mee zit :-)
Vanaf 1 punt is het prima te berekenen. Het gaat erom dat ik het vanaf elk willekeurig punt met elke willekeurige hoek moet kunnen uitrekenen. Het hoeft niet in ťťn formule, meerdere berekeningen zijn geen probleem.

De context is:
Ik maak een computerspelletje, waarbij vliegtuigen door een gebied vliegen. Ik wil van elk vliegtuig berekenen op welk punt hij het gebied verlaat.

Veranderd door mrfreeze, 06 juli 2010 - 12:45


#6

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 06 juli 2010 - 13:02

Okť, dat is de context die ik verwacht had ;)

Ik definieer hier even een voorbeeld-gebied (rechthoek):
Het punt (x,y) ligt binnen een rechthoek met hoekpunten (1,1),(1,5),(8,1),(8,5) als:

1<x<8 EN 1<y<5

Je kan dan makkelijk een functie IsInRechthoek(int x, int y) as boolean die true of false teruggeeft programmeren.

Manier 1
Een manier om het uitgangspunt te vinden is door een iteratie uit te voeren die de baan van je vliegtuig met kleine stapjes volgt tot op het punt waarop het zich niet meer in de rechthoek bevindt.

Dat is in mijn ogen het eenvoudigste dat je kan doen. Je moet dan een iteratie uitvoeren voor elk vliegtuig, en je moet deze opnieuw uitvoeren als het vliegtuig van richting is veranderd. Dat zou mogelijk traag kunnen zijn, afhankelijk van het aantal vliegtuigen, de grootte van het gebied, de grootte van de iteratiestap, etc.

Je kan als je het originele snijpunt gevonden hebt waarschijnlijk uit de verandering in de richting het nieuwe snijpunt wel met 2 vergelijkingen terugvinden als je nog wat met goniometrie prutst en dat zou deze manier kunnen optimaliseren.

Manier 2
Een andere manier is van de vergelijking van de zijlijnen op te stellen en te kijken of de baan van je vliegtuig deze snijdt.

In dit voorbeeld heb je als vergelijkingen: x=1, y=1, x=8, y=5

De vergelijking van je baan is dan iets van: y = a*(x-xvliegtuig) + yvliegtuig

Je kan dan de snijpunten uitdrukken met de randen van je gebied. Het snijpunt met de bovenste lijn kan echter rechts buiten de rechthoek vallen en dan weet je dat je vliegtuig het gebied verlaten heeft langs het snijpunt met de rechter grens.

Je moet in deze methode dus eens goed nadenken over de voorwaarden die je allemaal gaat controleren als je alle snijpunten bepaald hebt.

#7

mrfreeze

    mrfreeze


  • 0 - 25 berichten
  • 7 berichten
  • Gebruiker

Geplaatst op 06 juli 2010 - 13:07

Dank Xenion.

Manier 1 is hoe ik het nu doe ;) Maar ik dacht dat er vast een efficiŽntere manier zou zijn dan "proberen"...
Maar wellicht is dat wel de makkelijkste manier, al lijkt het me niet de snelste. Maar het hoeft inderdaad alleen maar bij het creŽren van het vliegtuig en het eventueel veranderen van koers uitgerekend te worden.

#8

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 06 juli 2010 - 13:13

Maar wellicht is dat wel de makkelijkste manier, al lijkt het me niet de snelste. Maar het hoeft inderdaad alleen maar bij het creŽren van het vliegtuig en het eventueel veranderen van koers uitgerekend te worden.

Mij lijkt het wel het snelste. Je kunt wel op een bepaald punt uitrekenen wanneer je moet gaan reageren. Maar bij elke iteratie zul je alsnog moeten checken of het vliegtuig op dat punt is aangekomen (of bijv. met een timer, waar je dan alsnog weer de tijd van zult moeten berekenen).

Een een vergelijking met: if((x < 0) || (x > 600) || (y < 0) || (y > 600)) is echt peanut bij het berekenen van een cosinus/sinus (beetje afhankelijk van hoe je hem berekent, kan namelijk ook gewoon met verhouding van verticale en horizontale snelheid). Maar je ontkomt er toch niet aan om elk frame opnieuw uit te rekenen of de posities nog kloppen.

#9

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 06 juli 2010 - 13:15

Je kan het zo ingewikkeld maken als je wil. Zolang Manier 1 niet zichtbaar traag wordt kan je die gerust gebruiken. Ik denk dat de 2de manier wel interessanter is qua performantie. Ze is eigenlijk niet echt ingewikkeld hoor, als je een paar schetsen tekent zal je het systeem wel snel doorhebben. Het rekenwerk is eenvoudig (geen goniometrie), je moet gewoon een paar if constructies maken om te kijken dat het vliegtuig bijvoorbeeld niet evenwijdig vliegt met een grens en er dus geen snijpunt is etc (delingen door 0 vermijden). En als je alle snijpunten dan hebt gevonden eens goed nadenken welke je nu moet nemen.

Ik zou je toch aanraden van het eens te bekijken ;)
Sowieso tekeningen maken ;)

#10

mrfreeze

    mrfreeze


  • 0 - 25 berichten
  • 7 berichten
  • Gebruiker

Geplaatst op 06 juli 2010 - 13:33

Haha ik doe de hele ochtend al niks anders dan tekenen ;)

Ik zit manier 2 nu al een aantal keer door te lezen, maar moet eerlijk bekennen dat ik 'm nog niet helemaal snap. Kun je die formule van de baan nog iets toelichten?

#11

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 06 juli 2010 - 14:30

Ik zit manier 2 nu al een aantal keer door te lezen, maar moet eerlijk bekennen dat ik 'm nog niet helemaal snap. Kun je die formule van de baan nog iets toelichten?


Ik weet niet hoe je de richting van je vliegtuig definieert. Maar wat ik gebruik is gewoon de vergelijking van een rechte door een punt met een richtingscoŽfficiŽnt a.

Hoe geef jij de richting aan? Met een hoek, met een dx en een dy, ...?

#12

mrfreeze

    mrfreeze


  • 0 - 25 berichten
  • 7 berichten
  • Gebruiker

Geplaatst op 06 juli 2010 - 15:17

Als richting gebruik ik het aantal graden, de hoek dus, een geheel getal tussen 0 en 359.

Maar wat ik gebruik is gewoon de vergelijking van een rechte door een punt met een richtingscoŽfficiŽnt a.

"gewoon" noemt-ie dat ;) Heb ruim 10 jaar niks meer met wiskunde gedaan, dus moet alles weer ff ophalen hoor ;)
RichtingscoŽfficiŽnt a ??

#13

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 06 juli 2010 - 17:02

"gewoon" noemt-ie dat :) Heb ruim 10 jaar niks meer met wiskunde gedaan, dus moet alles weer ff ophalen hoor ;)
RichtingscoŽfficiŽnt a ??


Haha, sorry dan ;) Ik vind het gewoon omdat het leerstof van het 4de middelbaar is als ik me niet vergis. Maar ik begrijp dat het voor jou misschien ver weg zit.

Maar als je het zo ziet staan zou je het toch moeten herkennen?

De richtingscoŽfficiŽnt geeft hoeveel stappen je omhoog gaat langs y, als je 1 stap naar rechts gaat langs x. (Simpel gezegd.)

Bijgevolg is de richtingscoŽfficiŽnt dus gelijk aan de tangens (LaTeX ) van de hoek die gemaakt wordt met de x as.

De vergelijking van de baan van je vliegtuig zal dus van deze vorm zijn:
LaTeX
of hetzelfde, maar in andere vorm: LaTeX
waarbij atan de boogtangens (of inverse tangensfunctie) is.

Deze 2 vergelijkingen (eigenlijk alle2 dezelfde, maar in andere vorm) kan je dan gebruiken om de snijpunten met de randen te berekenen, maar nogmaals: je moet de nodige controles uitvoeren:

- Als de hoek 90į is, dan bestaat de atan niet (of hij gaat naar oneindig) en dan gebruik je best gewoon de vergelijking van een rechte evenwijdig met de y as: x = xvliegtuig
De baan zal dan evenwijdig lopen met de linker en rechter rand en er dan bijgevolg geen snijpunt zijn met deze randen. Er zal echter wel een snijpunt zijn zowel op de bovenste als op de onderste rand en dan moet je terug gaan kijken naar de richting van het vliegtuig om te kijken naar welke kant hij vliegt.

- Analoog voor een hoek van 0į. Hier bestaat de atan wel en de formule zal gewoon werken (de x = vorm niet, want daar zou je door 0 delen), maar je zal weer evenwijdig vliegen met 2 randen en dan moet je weer de redenering van hierboven volgen.

Opmerking: ik ga hier uit van een rechthoekig gebied. Als de vorm verandert, dan wordt het allemaal iets ingewikkelder.


Als je hulp wil met de praktische uitwerking en programmering, maak dan eens een tekening van je gebied en je coŲrdinatenstelsel in paint en post die hier. Post ook je berekeningen/code eens en dan kijken we daar ook ineens naar.

Veranderd door Xenion, 06 juli 2010 - 17:07


#14

mrfreeze

    mrfreeze


  • 0 - 25 berichten
  • 7 berichten
  • Gebruiker

Geplaatst op 06 juli 2010 - 17:25

Haha, sorry dan ;) Ik vind het gewoon omdat het leerstof van het 4de middelbaar is als ik me niet vergis. Maar ik begrijp dat het voor jou misschien ver weg zit.

Ik heb ook alleen maar Havo wiskunde A en da's dus meer dan 10 jaar geleden... (had trouwens wel een 9,6 voor m'n examen, hoe ik daar ooit aan gekomen ben??) ;)

Maar als je het zo ziet staan zou je het toch moeten herkennen?

Ik kom een heel end, maar als ik zo'n formule als onderstaande zie begin ik toch weer even te fronsen...

De richtingscoŽfficiŽnt geeft hoeveel stappen je omhoog gaat langs y, als je 1 stap naar rechts gaat langs x. (Simpel gezegd.)

Die snap ik.

Bijgevolg is de richtingscoŽfficiŽnt dus gelijk aan de tangens (Bericht bekijken

De vergelijking van de baan van je vliegtuig zal dus van deze vorm zijn:
Bericht bekijken
Deze 2 vergelijkingen (eigenlijk alle2 dezelfde, maar in andere vorm) kan je dan gebruiken om de snijpunten met de randen te berekenen, maar nogmaals: je moet de nodige controles uitvoeren:

- Als de hoek 90į is, dan bestaat de atan niet (of hij gaat naar oneindig) en dan gebruik je best gewoon de vergelijking van een rechte evenwijdig met de y as: x = xvliegtuig
De baan zal dan evenwijdig lopen met de linker en rechter rand en er dan bijgevolg geen snijpunt zijn met deze randen. Er zal echter wel een snijpunt zijn zowel op de bovenste als op de onderste rand en dan moet je terug gaan kijken naar de richting van het vliegtuig om te kijken naar welke kant hij vliegt.

- Analoog voor een hoek van 0į. Hier bestaat de atan wel en de formule zal gewoon werken (de x = vorm niet, want daar zou je door 0 delen), maar je zal weer evenwijdig vliegen met 2 randen en dan moet je weer de redenering van hierboven volgen.

Ok, die controles gaan het probleem niet worden.

Opmerking: ik ga hier uit van een rechthoekig gebied. Als de vorm verandert, dan wordt het allemaal iets ingewikkelder.

Hij blijft rechthoekig. Vierkant zelfs :)

Als je hulp wil met de praktische uitwerking en programmering, maak dan eens een tekening van je gebied en je coŲrdinatenstelsel in paint en post die hier. Post ook je berekeningen/code eens en dan kijken we daar ook ineens naar.

Wauw! Erg behulpzaam!
Hier de code die ik nu gebruik om 't uit te rekenen (manier 1):
bool destFound = false;
double finalX, finalY;
int counter = 0;
while (destFound == false)
{
	counter++;
	finalX = X + (counter * Math.Sin(Heading * (Math.PI / 180)));
	finalY = Y - (counter * Math.Cos(Heading * (Math.PI / 180)));
	if (finalX <= 0 || finalX >= 600 || finalY <= 0 || finalY >= 600)
		destFound = true;
}
De tekening heeft denk ik weinig zin, het is een zwart vlak van 601x601 pixels :)

#15

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 06 juli 2010 - 17:56

Hier begin ik je al een beetje kwijt te raken.


Dat was gewoon even ter informatie, hoe je van die hoek naar een algebraÔsche vergelijking gaat. Als je in een rechthoekige driehoek de tangens van de hoek van de schuine zijde wil berekenen doe je overstaande zijde / schuine zijde. Dus tan(a) = dy/dx als je naar een stuk rechte kijkt. Jij hebt de hoek a gegeven, maar om de vergelijking te kunnen opstellen moet je dy/dx hebben. Dat gaat via de atan (boogtangens) => dy/dx = atan(a).

En hier ben je uit zicht ;)


Dat is "gewoon" het opstellen van de vergelijking van een rechte door een punt met een gegeven richting. Die richting hebben we hierboven afgeleid vanaf je hoek.

Wauw! Erg behulpzaam!
Hier de code die ik nu gebruik om 't uit te rekenen (manier 1):
De tekening heeft denk ik weinig zin, het is een zwart vlak van 601x601 pixels ;)


Manier 1 vergeten we nu even. Het is nu de bedoeling van de snijpunten te zoeken van de baan van het vliegtuig met de randen van de rechthoek.

Vraag: waarom wil je dit eigenlijk berekenen? Wat wil je met die punten gaan doen als je ze hebt?

Bijgevoegde afbeeldingen

  • vliegtuigje.jpg





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures