AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Winkelberechnung

Ein Thema von igel457 · begonnen am 19. Dez 2006 · letzter Beitrag vom 10. Nov 2015
Antwort Antwort
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Winkelberechnung

  Alt 19. Dez 2006, 19:25
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Winkelberechnung

  Alt 19. Dez 2006, 19:35
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Winkelberechnung

  Alt 19. Dez 2006, 20:04
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Muehle

Registriert seit: 24. Nov 2006
Ort: 92331 Parsberg
24 Beiträge
 
Delphi 2005 Architect
 
#4

Re: Winkelberechnung

  Alt 22. Dez 2006, 07:58
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.
G.M.
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#5

AW: Re: Winkelberechnung

  Alt 10. Nov 2015, 13:56
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Winkelberechnung

  Alt 10. Nov 2015, 14:15
Wirklich?
Ein neun Jahre alter Thread?

Wie wäre es mit einen Matheforum?
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#7

AW: Winkelberechnung

  Alt 10. Nov 2015, 19:24
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.

Geändert von DualCoreCpu (10. Nov 2015 um 19:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:37 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