Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Winkelberechnung (https://www.delphipraxis.net/82806-winkelberechnung.html)

igel457 19. Dez 2006 19:25


Winkelberechnung
 
Hallo,

ich bin es mal wieder mit einer Frage zur Vektorrechnung:

Ich habe einen Vektor V1 mit (0|1) und V2 mit (x|y). Nun kann man den Winkel zwischen zwei Vektoren ja mit dem Skalarprodukt ausrechnen. Also...

Code:
cos(a) = (X*0+Y*1)/(1*|V2|);
...oder vereinfacht...
cos(a) = (Y/|V2|);
...nun noch umstellen...
a = arccos(Y/|V2|);
...und in Grad...
a = radtodeg(arccos(Y/|V2|));
Mein Problem ist, dass dies irgendwie nich funktioniert... Ich erhalte irgendwie immer 0, 90 oder 180 Grad...


Mein gesammter Delphi-Sourcecode...

Delphi-Quellcode:
l := sqrt(sqr(Force.X)+sqr(Force.Y));
nx := Force.X / l;
ny := Force.Y / l;

ScrollBar3.Position := round(radtodeg(arccos(ny/l)));
ScrollBar4.Position := round(l);
Danke für die Hilfe,
igel457

3_of_8 19. Dez 2006 19:35

Re: Winkelberechnung
 
Ich würds anders machen: Gegenkathete durch Ankathete und bei beiden Vektoren, jeweils ArcTan und RadToDeg drauf und dann einfach die Differenz der Winekl berechnen.

Khabarakh 19. Dez 2006 20:04

Re: Winkelberechnung
 
Jupp, warum einfach, wenn... ;) .

@igel457: Deine Formel ist richtig, in der Übersetzung ist aber der Wurm drin: Du teilst die Ordinate zweimal durch den Betrag.

Muehle 22. Dez 2006 07:58

Re: Winkelberechnung
 
igel457 hat recht, du teilst 2-mal durch die Länge des einen Vektors. (Der andere hat die Länge 1).

Du musst zudem bei der arc-Fkt. aufpassen, sie liefert nur einen Hauptast zwischen 0 und Pi.
Die richtige Lsg.-menge lautet: arccos() + k*Pi. k ist eine ganze Zahl.

Kommt immer drauf an, was du machen willst, meistens reicht der Hauptast.

DualCoreCpu 10. Nov 2015 13:56

AW: Re: Winkelberechnung
 
Zitat:

Zitat von Muehle (Beitrag 564346)
igel457 hat recht, du teilst 2-mal durch die Länge des einen Vektors. (Der andere hat die Länge 1).

Du musst zudem bei der arc-Fkt. aufpassen, sie liefert nur einen Hauptast zwischen 0 und Pi.
Die richtige Lsg.-menge lautet: arccos() + k*Pi. k ist eine ganze Zahl.

Upps, wie sieht es denn diesbezäglich mit der ArcTan Funktion aus?

Ich brauche Winkel zwischen 0 und 360 Grad. Bin da auch gerade stark beschäftigt mit dem Winkelproblem.

TiGü 10. Nov 2015 14:15

AW: Winkelberechnung
 
Wirklich?
Ein neun Jahre alter Thread?

Wie wäre es mit einen Matheforum?

DualCoreCpu 10. Nov 2015 19:24

AW: Winkelberechnung
 
Danke auch @TiGÜ:

Ich habe halt in der DP gestöbert, weil meine Pie Funktion, die ich mal gerade wegen der diffizilen Winkelberechnung selber schreiben wollte und wohl auch werde. Wie soll ich sonst in Mathe wieder fit werden?. Kann nur lernen dabei, Andere schreiben ganze Spiele, wo mit Sicherheit ein ganzes Stück mehr Mathe Kenntnisse nötig sind. Hätte auch Lust auf ein selber programmiertes Computerspiel. Aber wenn ich noch nicht mal so ne besch*** Bogenfunktion hinkriege????

Hab übrigens zu meinem Strang die Skizzen hinzu gefügt und leider immer noch keine Idee, warum mein Bogen nicht gezeichnet wird. Nur ganze Ellipse geht. Daß aber auch der Bogen zu zeichenen gehen muss, zeigt Windows selber mit der Originalfunktion.

Ich komm nich drauf, warum mein Bogen nicht gezeichnet wird.

Da hab ich halt hier geguckt, ob da einer so ne Berechnung schon mal gemacht hat und da ist mir das Alter des Stranges komplett egal. Ich habe gegoogelt, ich habe dieses Forum hier durchstöbert weil ja heutzutage "alles im Internet sooo tolllll zu finden ist" Dabei hab ich diesen Strang hier gefunden. Und ich habe auch was zur Vektorrechnung und zu Polarkoordinaten gefunden.

Hab unter dem Suchbegriff Winkelberechnung übrigens auch das hier gefunden:

Delphi-Quellcode:
Winkel:=ArcTan((YPunkt2-YPunkt1)/(XPunkt2-XPunkt1)) *180/PI;

if ((YPunkt2 > YPunkt1) and (XPunkt2 < XPunkt1)) or ((YPunkt2 < YPunkt1) and (XPunkt2 < XPunkt1)) then
  Winkel := Winkel + 180
else if ((YPunkt2 < YPunkt1) and (XPunkt2 > XPunkt1)) then
  Winkel := Winkel +360;
und zwar hier:
http://www.delphipraxis.net/101500-w...erechnung.html

Nur wenn ich diese Funktion kopiere und so hier abwandle:

Delphi-Quellcode:
function QuadAngle(XPunkt1,YPunkt1,Xpunkt2,YPunkt2: Extended): Extended;
var
  Winkel: Extended;
begin
  //Wenn ich diese Funktion verwende, wird die ganze Ellipse gezeichnet
  Winkel:=ArcTan((YPunkt2-YPunkt1)/(XPunkt2-XPunkt1)) *180/PI;

  if ((YPunkt2 > YPunkt1) and (XPunkt2 < XPunkt1)) or ((YPunkt2 < YPunkt1) and (XPunkt2 < XPunkt1)) then
    Winkel := Winkel + 180
  else if ((YPunkt2 < YPunkt1) and (XPunkt2 > XPunkt1)) then
    Winkel := Winkel +360;

  Result := Round(Winkel) mod 360; //Für den Fall, das der Winkel mal größer als 360 Grad wird.
end;
wird die ganze Ellipse und nicht wie ich das eigentlich haben will der Bogen zwischen zwei Punkten gezeichnet, die nicht mit Anfangs und Endwinkel, sondern mit den jeweiligen x,y Koordinaten angegeben sind. Muss doch auch gehen, die Original-Windows API Funktion macht das doch so.

Aber wie macht die das?

In Assembler bin ich nicht fit genug, im Original Api gdi32.dll nachschauen bringt mir daher nix, sieht allerdings Onkel Bill auch nicht gerne, wenn ich es täte.

WO ist den nun der Fehler in meiner Funktion. In der ursprünglichen namens QuadrantAngle.

Die hier oben ist bloß von hier kopiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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