Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Vektor mit bestimmtem winkel erzeugen (https://www.delphipraxis.net/82891-vektor-mit-bestimmtem-winkel-erzeugen.html)

Antigo 21. Dez 2006 13:59


Vektor mit bestimmtem winkel erzeugen
 
Servus,
Ich hab grad ein totales Brett vorm Kopf. Ich möchte einen Vektor erzeugen, der eine bestimmte Länge und einen bestimmten Winkel (1-360°) hat.

Wie gehe ich da am besten ran? Über tan(alpha)=Gegen/ANkathete?

edit sry ganz vergessen, es geht um 2d vektoren. X1 und X2 sind also gesucht bei gegebenem WInkel und gegebener Länge.

Cöster 21. Dez 2006 14:25

Re: Vektor mit bestimmtem winkel erzeugen
 
Die Länge eines Vektors kriegst du doch mit dem Pythagoras raus. Was meinst du mit Winkel? Winkel wozu?

QuickAndDirty 21. Dez 2006 14:39

Re: Vektor mit bestimmtem winkel erzeugen
 
x := Cos(alpha) * laenge
y := Sin(alpha) * laenge

evtl. x und y vertauschen....must mal eben ausprobieren.
Du must mit double Werten Rechnen und dann nach int Konvertieren

Khabarakh 21. Dez 2006 15:37

Re: Vektor mit bestimmtem winkel erzeugen
 
Zitat:

Zitat von QuickAndDirty
evtl. x und y vertauschen

Nein
Zitat:

Du must mit double Werten Rechnen und dann nach int Konvertieren
:gruebel: In den allermeisten Fällen werden Vektorkoordinaten weiterhin als Fließkommazahl gespeichert.

@Cöster: Polarkoordinaten sind eine übliche Darstellung von Vektoren.

Antigo 21. Dez 2006 21:14

Re: Vektor mit bestimmtem winkel erzeugen
 
erstmal danke für eure Hilfe. meine Prozedur sieht jetzt so aus:

Delphi-Quellcode:
procedure TVektor.setzewinkel(alpha:double);
begin
 if alpha <= 0 then alpha:=360+alpha;
 x1:=cos(degtorad(alpha))*giblaenge;
 x2:=sin(degtorad(alpha))*giblaenge;
end;
meine Prozedur gibwinkel sieht so aus:
Delphi-Quellcode:
function TVektor.Gibwinkel2;
begin
  if x2 >= 0 then result:=radtodeg(arccos(x1/giblaenge))
  else result:=360-radtodeg(arccos(x1/giblaenge))
end;
Generell funktioniert das ganze auch. Zumindest ungefähr. Ich mache nun bei meinem kleinens SPielchen folgendes:

Delphi-Quellcode:
   
  kanone.vrohr.setzewinkel(45);
  showmessage(floattostr(kanone.vrohr.gibwinkel));
Ich setze den Winkel also auf 45 Grad und lasse ihne sofort danach ausgeben. Heraus kommt aber nicht 45 ° sondern
~50,76. Durch diese UNgenauigkeiten wird alles ziemlich unschön. Ich arbeite aber überall mit doppelter Genauigkeit. WIe kann ich da wo etwas verbessern? Ich danke schonmal im vorraus :)

Khabarakh 21. Dez 2006 21:22

Re: Vektor mit bestimmtem winkel erzeugen
 
Wenn du innerhalb einer Prozedur Felder des Objektes veränderst, darfst du natürlich nicht erwarten, dass Funktionen immer noch den gleichen Wert zurückgeben.
Delphi-Quellcode:
if alpha <= 0 then alpha:=360+alpha;
Überflüssig
Delphi-Quellcode:
if x2 >= 0 then result:=radtodeg(arccos(x1/giblaenge))
  else result:=360-radtodeg(arccos(x1/giblaenge))
Delphi-Referenz durchsuchenArcTan2

Antigo 21. Dez 2006 21:40

Re: Vektor mit bestimmtem winkel erzeugen
 
Zitat:

Zitat von Khabarakh
Wenn du innerhalb einer Prozedur Felder des Objektes veränderst, darfst du natürlich nicht erwarten, dass Funktionen immer noch den gleichen Wert zurückgeben.
Delphi-Quellcode:
if alpha <= 0 then alpha:=360+alpha;
Überflüssig
Delphi-Quellcode:
if x2 >= 0 then result:=radtodeg(arccos(x1/giblaenge))
  else result:=360-radtodeg(arccos(x1/giblaenge))
Delphi-Referenz durchsuchenArcTan2

hmm jo das alpha zu verändern ist in der Tat überflüssig. Das mit dem Arctan2 gucke ich mir mal an, aber die bisherige Funktion liefert ja grundsätzlich auch das richtige, nur eben ungenau und das ist es was ich nicht verstehe...

edit: ok arctan2 ist eingebunden. meine gibwinkel prozedur sieht jetzt also so aus:

Delphi-Quellcode:
function TVektor.Gibwinkel2;
begin
  result:=radtodeg(arctan2(x2,x1));
end;
schonmal sehr viel einfacher danke :)

die setzewinkel haut jedoch immer noch nicht hin, aus 20 wird damit beispielsweise 23,xx

Khabarakh 21. Dez 2006 21:57

Re: Vektor mit bestimmtem winkel erzeugen
 
Dann eben noch einen weiteren Hint zusätzlich zu meinem ersten Satz ;) : TVektor.SetzeWinkel: x1 <-> GibLaenge

Antigo 21. Dez 2006 22:03

Re: Vektor mit bestimmtem winkel erzeugen
 
unfassbar, den Fehler hab ich schon beim setzen der Länge begangen. :wall:

danke für die Aufklärung, nun passt es... :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz