AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu Winkelberechnungen...

Ein Thema von md_mse · begonnen am 28. Nov 2005 · letzter Beitrag vom 30. Nov 2005
Antwort Antwort
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#1

Frage zu Winkelberechnungen...

  Alt 28. Nov 2005, 12:20
Hallo!

Ich habe mal wieder ein mathematisches Problem...
Diesmal geht es um Winkelberechnungen, und zwar: Ich habe einen Pfad (eine Spline), ich kenne die Koordinaten jedes Punktes der Spline. Nun möchte ich ein Objekt diesen Pfad folgen lassen, was an sich kein Problem ist... Nur macht mir die Berechnung des richtigen Winkels um den das Objekt gedreht werden muss, damit es realistisch aussieht.

Mein Ansatz bisher war folgender:
Delphi-Quellcode:
LenX := XKoordinateVonSplinePunkt;
LenY := YKoordinateVonSplinePunkt;
VecLen := Sqrt(Sqr(LenX) + Sqr(LenY));
Yaw := ArcSin(YKoordinateVonSplinePunkt / VecLen);
Dies funktioniert aber nicht so wie es sollte, zumindest stimmt der Winkel meistens nicht.
Was kann man da machen???

Im Anhang habe ich versucht mein Problem nochmal zu verdeutlichen.
Miniaturansicht angehängter Grafiken
asinproblem_419.png  
  Mit Zitat antworten Zitat
Benutzerbild von chrisw
chrisw

Registriert seit: 11. Jan 2005
Ort: Schleswig
193 Beiträge
 
Delphi XE8 Professional
 
#2

Re: Frage zu Winkelberechnungen...

  Alt 28. Nov 2005, 12:32
Hab das mal so gelöst, ist aber schon länger her !
Delphi-Quellcode:
function AngleOfPoint (Pt :TPoint) : double;
begin
  Result := 0;
  if ((Pt.X = 0) and (Pt.Y < 0)) then Result := 270 else
  if ((Pt.X = 0) and (Pt.Y > 0)) then Result := 90 else
  if ((Pt.X > 0) and (Pt.Y >= 0)) then Result := ArcTan(Pt.Y / Pt.X) * RadToDeg else
  if ((Pt.X < 0) and (Pt.Y > 0)) then Result := 180 + ArcTan(Pt.Y / Pt.X) * RadToDeg else
  if ((Pt.X < 0) and (Pt.Y <= 0)) then Result := 180 + ArcTan(Pt.Y / Pt.X) * RadToDeg else
  if ((Pt.X > 0) and (Pt.Y < 0)) then Result := 360 + ArcTan(Pt.Y / Pt.X) * RadToDeg else
  Result := 0;
end;

function PointOfAngAndDist (Angle,Distance : Double) : TPoint;
var Radians : Double;
begin
  Radians := Angle * DegToRad;
  Result.X := Round(Distance * Cos(Radians));
  Result.Y := Round(Distance * Sin(Radians));
end;
Musst immer den Punkt angeben, auf den "gezeigt" werden soll, der Winkel wird zurückgegeben.

Vielleicht kannst Du da was mit anfangen !



//EDIT : Sry, hatte die 2. Funktion vergessen !!!
Christian Wahl
me, myself and I, die lustigen Drei !!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Frage zu Winkelberechnungen...

  Alt 28. Nov 2005, 13:12
Du müsstest an jedem Punkt auf der Spline Kurve die Ableitung der Spline-Funktion berechnen,
denn die Steigung entspricht dem Winkel.
Winkel = arctan(steigung)
Wenn du kubische Splines verwendest siehe: Spline-Interpolation
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#4

Re: Frage zu Winkelberechnungen...

  Alt 28. Nov 2005, 13:57
Hm...
@chrisw: Leider stimmt der Winkel nicht mit der Spline überein...
@shima: Könntest du einer Mathe-Null wie mir ein Beispiel geben?

Ich berechne die Punkte in der Spline folgendermaßen:
Delphi-Quellcode:
CurrX := A.X * Power(Step, 3) + 3 * B.X * Power(1 - Step, 2) * Step + 3 * C.X * (1 - Step) * Power(Step, 2) + D.X * Power(Step, 3);
CurrY := A.Y * Power(Step, 3) + 3 * B.Y * Power(1 - Step, 2) * Step + 3 * C.Y * (1 - Step) * Power(Step, 2) + D.Y * Power(Step, 3);
Wobei
Code:
Step
jeweils um
Code:
1 / SplineLänge-1
erhöht wird...

Die Ableitung meiner Funktion müsste ja eigentlich so aussehen, wobei ich nicht weiss ob ich die X oder die Y "Achse" ableiten soll :/
DerivationX := 3 * A.X * Power(Step, 2) + 6 * B.X * (1 - Step) * Step + 6 * C.X * (1 - Step) * Step + 3 * D.X * Power(Step, 2);
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#5

Re: Frage zu Winkelberechnungen...

  Alt 29. Nov 2005, 18:50
*Push*
  Mit Zitat antworten Zitat
mare_crisium

Registriert seit: 6. Nov 2005
17 Beiträge
 
Delphi 5 Standard
 
#6

Re: Frage zu Winkelberechnungen...

  Alt 29. Nov 2005, 19:50
md_mse,

der Irrtum bei Deinem ersten Ansatz ist folgender: In der Formel

Delphi-Quellcode:
  LenX := XKoordinateVonSplinePunkt;
  LenY := YKoordinateVonSplinePunkt;
  VecLen := Sqrt(Sqr(LenX) + Sqr(LenY));
  Yaw := ArcSin(YKoordinateVonSplinePunkt / VecLen);
geht der Vektor immer vom Nullpunkt aus zum augenblicklichen Punkt (LenX|LenY). Der Winkel, den Du herausbekommst, ist deshalb immer der Winkel zwischen dem Vektor vom Nullpunkt nach (LenX|LenY) und der x-Koordinate. Du willst aber, wie shmia richtig erkannt hat, die Ableitung der Splinefunktion haben, um Dein Objekt immer die Kurve entlang gucken zu lassen.

Bei mir ist das mit der Mathe auch schon ein Weilchen her, aber ich würde das so machen: Du suchst die Steigung:

Delphi-Quellcode:
. dy
.s = ----
. dx
Das ist aber nicht so ohne Weiteres zu berechnen, weil sowohl x, als auch y von "step" abhängen. Erinnerst Du Dich noch an die Kettenregel beim Ableiten von Funktionen? Die verwendet man hier mit Vorteil:

Delphi-Quellcode:
. dy
. -----
. dy dy dstep dstep
.s = ---- = ------- * -------- = --------------
. dx dstep dx dx
. -------
. dstep
Du musst also die y-Komponente Deiner Spline nach "step" ableiten und durch die Ableitung der x-Komponente der Spline nach "step" dividieren. Zeig' die Formel bloss keinem Mathematiker! Der kriegt dann nämlich einen Herzanfall (weil er alle Ausnahmen kennt, unter denen meine Formel falsch ist)!

Probier's trotzdem mal und lass uns wissen ob's damit klappt.

mare_crisium
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

Re: Frage zu Winkelberechnungen...

  Alt 29. Nov 2005, 20:48
Ich hatte mal so ein ähnliches Problem: http://www.delphipraxis.net/internal...=460057#460057
Wenn's hilft.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#8

Re: Frage zu Winkelberechnungen...

  Alt 30. Nov 2005, 09:35
So, ich möchte euch erstmal für eure Mühen danken, jedoch hat mich keine vorgeschlagene Lösung weiter gebracht .
Die Ableitung der X Achse brachte mir immer nur den gleichen Wert, die Ableitung der Y-Achse war unberechenbar , zumindest bei der von mir verwendeten Spline-Funktion.
Ein Kommillitone hat sich mal folgende Lösung ausgedacht, die perfekt funktioniert:
Delphi-Quellcode:
function SubtractVectors(AVec1, AVec2: TD3DVector): TD3DVector; inline;
begin
  Result := D3DXVector3(AVec2.x - AVec1.x, AVec2.y - AVec1.y, AVec2.z - AVec1.z);
end;

//x1,y1 : Vector Startpunkt, x2,y2 : Vector End punkt
function CalculateAngel(AVec1, AVec2: TD3DVector): Single;
var
  Flt: Single;
begin
  // Vektor in sein eigenes System bewegen
  SubtractVectors(AVec1, AVec2);
  AVec2.x := 1;
  AVec2.z := 0;

  // Winkel berechen
  Flt := Sqrt( Sqr(AVec1.x) + Sqr(AVec1.z) ) * Sqrt( Sqr(AVec2.x) + Sqr(AVec2.z) );
  if not IsZero(Flt) then
    Result := Abs(ArcCos(((AVec1.x * AVec2.x) + (AVec1.z * AVec2.z)) / Flt)) else
    Result := 0.0;

  //1. Quadrant
  if (AVec1.x > 0) and (AVec1.z > 0) then
    // keine Änderung
    //2. Quadrant
    else if (AVec1.x < 0) and (AVec1.z > 0) then
    // keine Änderung
    //3.Quadrant
    else if (AVec1.x < 0) and (AVec1.z < 0) then
      Result := Result + Pi
    //4.Quadrant
    else if (AVec1.x > 0) and (AVec1.z < 0) then
      Result := Result + Pi;
end;
Trotzdem nochmal vielen Dank!

P.S.: Vielleicht etwas für die CodeLib (Stichwort Direct3D/Winkelberechnung)?
  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 07:39 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