[JAVA] Coordinaten berekenen met snelheid en koers

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

  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
Ik programmeer een soort zeeslag en zit vast met een formule.

Ik heb een speelveld van 100 bij 100 punten.
Ik heb nu 4 variabelen: snelheid, koers, x en y.
snelheid wordt nu even voor het gemak genomen in punten per
seconden en koers in graden 0 tot 360. (0 is absoluut noord)
De rasterpunten worden gemeten met een precisie van 2 getallen
achter de komma.

Stel, ik heb een bootje op locatie 50,50 die vaart met 3 punt per
seconde en heeft een koers van 135 graden.

Hoe bereken ik de volgende coordinaten, ik probeerde het met
cos (x-coordinaat) en sin (y-coordinaat) te berekenen, omdat ik
de hoek en afgelegde afstand weet, maar ik mijn formule klopt niet.

Ik dacht de nieuwe coordinaten worden dan zo berekend:
xVerschil = afstand / Math.cos(koers % 90);
yVerschil = afstand / Math.sin(koers % 90);

Aan de hand van het aantal graden wordt daarna dit vershil bij de
coordinaten opgeteld of afgetrokken.

Helaas geeft dit als uitkomst NaN bij het uitprinten van het verschil.
Wie heeft er een wiskunde knobbel en weet mijn formule te verbeteren?
Misschien heb je wel een veel betere oplossing of kun je een mij wijzen
op online info?

Elk beetje info is mooi meegenomen, maar het hoeft niet ingewikkeld te
worden.

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Twee suggesties zonder naar de formule zelf te kijken, maar die je misschien toch kunnen helpen:
1) Weet je zeker dat koers of koers%90 wel correct numbers zijn? Van de cos:
Returns the trigonometric cosine of an angle. Special cases:
If the argument is NaN or an infinity, then the result is NaN.
2) De parameters van sin en cos moeten in radialen zijn. Misschien vindt Java het niet zo lekker dat je 'm graden geeft?

[ Voor 29% gewijzigd door SWfreak op 16-06-2003 23:14 ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Waarschijnlijk heb je er niet zoveel aan, maar wat je zou kunnen doen:

Java bevat een library voor affine transformaties. Je kunt dit zien als een aantal acties die je op een punt uitvoert, waarbij die acties bestaan uit translaties (punt verplaatsen) en rotaties. Door een 'huidige transformatie' bij te houden en die telkens uit te breiden (met translaties en rotaties) krijg je elke keer het volgende punt berekenen door alleen maar het punt (0,0) in de transformatie in te vullen.

[ Voor 30% gewijzigd door Infinitive op 16-06-2003 23:50 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Misschien wil je dit niet maar een optie, zoals ik zoiets een keer gedaan heb:

Neem 2 snelheden: X en Y, en geen koers, dat werkt een stuk makkelijker

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
afstand / cos (angle)

moet zijn:

dx = cos(angle)*speed;
dy = sin(angle)*speed;

en wel effe checken of je met Radians werkt he ---

  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
Bedankt voor jullie reactie, ik waardeer het in ieder geval.

Wat nerd-o-matic voorstelde om 2 snelheden te gebruiken, ik denk dat dat erg lastig wordt, ik werk namelijk met een projectgroep en we zijn in een best vergevorderd stadium van deze multi-user zeeslag, waarbij het protocol tussen de server en clients al gedefineerd is.

Wat infinitive betreft, ik denk dat je de library "java.awt.geom.AffineTransform" bedoelt, dat lijkt me inderdaad wel handig, bedankt voor de tip.

Ik maak de class GameObject, die dus alle info bevat voor een object en moet dus ook deze functie bevatten.

Ik was vergeten met radialen te werken, maar ik ben vergeten hoe dat in zn werk gaat, ik moet maar weer eens mn wiskunde boek tevoorschijn halen, als ik hem kan vinden :)

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
hobbit_be schreef op 17 juni 2003 @ 00:13:
afstand / cos (angle)

moet zijn:

dx = cos(angle)*speed;
dy = sin(angle)*speed;

en wel effe checken of je met Radians werkt he ---
Klopt, ik had het omgedraaid, veel te moe, niet goed geslapen.
Ik hoop morgen (vanmiddag) weer fris achter mijn pc-tje te klimmen.

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Radians:

2Pi = 360deg
Pi=180deg

1deg = Pi/180

  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
Dan zou het volgende moeten kloppen:
radian = (degrees / 180) * Math.PI;

Alleen geeft het volgende 0,0:
double getal = 45 / 180;

Ik begrijp alleen niet waarom, het is een double,
dus hij zou de precisie moeten hebben om en
normale waarde hiervan te onthouden, maar bij
System.out.println(getal); wordt er 0.0 uitgeprint.

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
If8022n2IOk1Z8 schreef op 17 juni 2003 @ 12:04:
Dan zou het volgende moeten kloppen:
radian = (degrees / 180) * Math.PI;

Alleen geeft het volgende 0,0:
double getal = 45 / 180;

Ik begrijp alleen niet waarom, het is een double,
dus hij zou de precisie moeten hebben om en
normale waarde hiervan te onthouden, maar bij
System.out.println(getal); wordt er 0.0 uitgeprint.
Hmm blijkbaar nog nooit geprogrammeerd?

als jij typt: 45 / 180 == int/int = int die jij dan 'cast' naar een double

het moet dus zijn:

45.0 / 180.0 = double/double = double (and no cast)

Dit is in bijna elke programmeer taal

edit:
sorry eerste comment :) - niets persoonlijks :)

[ Voor 6% gewijzigd door hobbit_be op 17-06-2003 12:14 ]


  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
Shit, das waar ook, ik nam aan dat Java 1.4 inmiddels wel
beter kon inschatten naar welke type de waarden gecast werden,
maar het blijft een prutstaal :-) (niets persoonlijks)

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
If8022n2IOk1Z8 schreef op 17 June 2003 @ 12:32:
Shit, das waar ook, ik nam aan dat Java 1.4 inmiddels wel
beter kon inschatten naar welke type de waarden gecast werden,
maar het blijft een prutstaal :-) (niets persoonlijks)
Tuurlijk niet. Java moet wel met zijn poten van mijn types afblijven. Als ik zeg dat iets een int is dan is het een int. Het zou wat worden als hij zelf even zou gaan bedenken of hij iets moet gaan casten of niet.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

If8022n2IOk1Z8 schreef op 17 June 2003 @ 12:32:
Shit, das waar ook, ik nam aan dat Java 1.4 inmiddels wel
beter kon inschatten naar welke type de waarden gecast werden,
maar het blijft een prutstaal :-) (niets persoonlijks)
Dat jij daar standaard vanuit gaat geeft meer aan dat jij een pruts programmeur bent ;)..

Een int is een int is een int is een int. Een deling op een int is dan ook een gehele deling. Als ik cijfers achter de komma wil wil ik een float en maak ik die er zelf wel van. Je hebt immers lang niet altijd het getal achter de komma nodig.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
If8022n2IOk1Z8 schreef op 17 June 2003 @ 12:32:
maar het blijft een prutstaal :-) (niets persoonlijks)
al goed dat niemand hier Java heeft gecreerd dan ;). Ik dacht vroeger ook zo hoor ivm Java - maar qua taal vind ik er weinig mis mee (1.5 wordt wel een PAK beter) nu dat ik er een tijdje mee heb gewerkt. Alleen sommige libraries vind ik nogal gortig en vooral de slechte threading support...

Waarin programmeer je normaal dan? Want dit behaviour is ook in C/C++/C#/Pascal ...

  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
Als de variabele getal als double ge-initieerd wordt, goh, welk soort waarde zou ik dan in willen stoppen.

Maar goed, mijn probleem is inmiddels opgelost en maak gebruik van:
Math.toRadians, erg simpel gelukkig. Bedankt voor alle hulp.

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • If8022n2IOk1Z8
  • Registratie: Juni 2000
  • Laatst online: 23-01-2023
hobbit_be schreef op 17 June 2003 @ 13:27:
[...]
<KNIP

Waarin programmeer je normaal dan? Want dit behaviour is ook in C/C++/C#/Pascal ...
PHP, hoef je niet eens aan te geven welk datatype het is, gebeurt automatisch en
geen problemen mee gehad.

AsRock 690FX Deluxe3 - AMD X4 640, 4GB PC6400 DualChannel Kingston - 1x OCZ 60GB SSD - Samsung SpinPoint 1TB


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
PHP is dan ook een scripting taal he :) - en wees gerust eens dat je erg 'hardcore' php gaat doen wordt die omzetting niet meer zo leuk... maar goed nu weet iedereen waarom je het gek vind dat ie het niet doet.
Pagina: 1