Goniometrie vraagstuk

Moderators: ArcherBarry, Fuzzwood

Berichten: 7

Goniometrie vraagstuk

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!

Gebruikersavatar
Berichten: 24.578

Re: Goniometrie vraagstuk

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

Gebruikersavatar
Berichten: 2.609

Re: Goniometrie vraagstuk

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?

Berichten: 1.116

Re: Goniometrie vraagstuk

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.

Berichten: 7

Re: Goniometrie vraagstuk

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.

Gebruikersavatar
Berichten: 2.609

Re: Goniometrie vraagstuk

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.

Berichten: 7

Re: Goniometrie vraagstuk

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.

Berichten: 1.116

Re: Goniometrie vraagstuk

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.

Gebruikersavatar
Berichten: 2.609

Re: Goniometrie vraagstuk

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 ;)

Berichten: 7

Re: Goniometrie vraagstuk

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?

Gebruikersavatar
Berichten: 2.609

Re: Goniometrie vraagstuk

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, ...?

Berichten: 7

Re: Goniometrie vraagstuk

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 ??

Gebruikersavatar
Berichten: 2.609

Re: Goniometrie vraagstuk

mrfreeze schreef:"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 (
\(\frac{\Delta y}{\Delta x}\)
) van de hoek die gemaakt wordt met de x as.

De vergelijking van de baan van je vliegtuig zal dus van deze vorm zijn:
\(y = atan(\alpha)*(x-x_{vliegtuig})+y_{vliegtuig}\)
of hetzelfde, maar in andere vorm:
\(x = \frac{y - y_{vliegtuig}}{atan(\alpha)} + x_{vliegtuig}\)
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.

Berichten: 7

Re: Goniometrie vraagstuk

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.
Xenion schreef:Bijgevolg is de richtingscoëfficiënt dus gelijk aan de tangens (
\(\frac{\Delta y}{\Delta x}\)
De vergelijking van de baan van je vliegtuig zal dus van deze vorm zijn:
\(y = atan(\alpha)*(x-x_{vliegtuig})+y_{vliegtuig}\)
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):

Code: Selecteer alles

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 :)

Gebruikersavatar
Berichten: 2.609

Re: Goniometrie vraagstuk

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.
mrfreeze schreef: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?
Bijlagen
vliegtuigje.jpg
vliegtuigje.jpg (9.71 KiB) 383 keer bekeken

Reageer