Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Apr 25, 2024 22:30

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vektorrechnung
BeitragVerfasst: Mi Dez 08, 2004 15:38 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hi,

(Sorry, mir ist leider kein besserer Titel eingefallen)

Ich versuch erstmal mein "Problem" mal zu umschreiben. (Oder schaut einfach das Bild an...)
Mein Ziel ist es, einen Pfad dicker zu zeichnen.
Der Pfad besteht momentan aus zwei Vektoren, die aneinanderhängen.
Sie bilden also eine Ecke.

Praktisches Beispiel: Darstellung von Blitzen. Ein Blitz, der sich nicht aufspaltet, beschreibt ja einen Pfad, der sich in Vektoren unterteilen lässt. Doch wie zeichnet man einen solchen Blitz? Eine Möglichkeit wäre mit Linien, doch ist das Resultat davon etwas "faserig". (Siehe auch das Blitzdemo von Jan Horn)

Aber man könnte doch auch Vierecke statt der Linien zeichnen. Wenn man dann noch eine Textur darufpappt, schaut das ganze schon ganz hübsch aus.
Doch woher bekommt man die Vertex-Koordinaten für das Viereck???

Mir ist da folgende Idee gekommen: Wenn man erstmal nur 2 Vektoren nimmt, bildet man aus diesen beiden ein Parallelogram. Dann bastelt man die Diagonale und verlängert diese. Schon hat man eine Achse, auf der die Koordinaten liegen.

Ich weiß nicht, ob es die Beste Lösung ist (Mit Sicherheit nicht :wink: ), aber mir ist nichts besseres eingefallen.

Was gibt es noch für Lösungen für dieses Problem?

Zum Bild: Die nicht-beschrifteten Linien stellen die Form dar, die ich dann am Ende gern hätte.


Dateianhänge:
vektor.png
vektor.png [ 94.82 KiB | 9018-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 08, 2004 16:28 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ein paar Nachteile hat das ganze noch:

Scheint nur in einer Ebenen Fläche zu funktionieren (Also nix 3D)
Die Vektoren müssen gleich lang sein


Evtl. kann man das aber einfacher über das Skalarprodukt lösen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 08, 2004 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Wenn du den Differenzvektor der normierten (Länge=1) Vektoren nimmst, erhällst du die Richtung der Winkelhalbierenden. Die dürfte besser geeignet sein, als die Diagonale des Parallelograms.

Ausserdem musst du den Abstand der Koordinaten vom Winkelscheitelpunkt vom jeweiligen Winkel zwischen den zwei Vektoren abhängig machen, um zu gewerleisten, dass der "Pfad" überall gleich breit ist.
Der Abstand müsste Proportional sein zu 1/cos((180-Winkel(v1,v2)/2) (keine Garantie, einfach aufzeichnen und gucken).

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 08, 2004 18:32 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
geo hat geschrieben:
Wenn du den Differenzvektor der normierten (Länge=1) Vektoren nimmst, erhällst du die Richtung der Winkelhalbierenden. Die dürfte besser geeignet sein, als die Diagonale des Parallelograms.

*grübel grübel grübel...*
Da ist was dran...
Das ist ja infach genial!
Damit sind zwei Fliegen mit einer Klappe geschlagen! Das ganze geht auch in 3D und es ist um Längen einfacher! :D

geo hat geschrieben:
Ausserdem musst du den Abstand der Koordinaten vom Winkelscheitelpunkt vom jeweiligen Winkel zwischen den zwei Vektoren abhängig machen, um zu gewerleisten, dass der "Pfad" überall gleich breit ist.
Der Abstand müsste Proportional sein zu 1/cos((180-Winkel(v1,v2)/2) (keine Garantie, einfach aufzeichnen und gucken).


Hmm... ja. ich hab mir dazu auch mal experimentell ein paar Werte nachgemessen (Vorher ein paar Beispiele konstruiert) und den Abstand der Koordinaten vom Winkelscheitelpunkt als Graph darstellen lassen. Das, was dabei rauskahm, sah schon irgendwie nach Siux aus, aber ich stand da wohl irgendwie aufm Schlauch.
Aber wie kommst du auf diese Formel??? Gesetzten Falls, die stimmt...
Muss ich gleich mal ausprobieren.

Thx!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 08, 2004 21:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Dreh mal deinen Blitz um 90° und du hast ein Problemm. Darum würde ich dir raten so eine Art Billboard zu nützen.

Der einzigste Hacken dabei ist, dass im Billboard Artikel noch nicht beschrieben wird, wie man so ein Ecken Problemm löst.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 08, 2004 21:26 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Flo hat geschrieben:
Dreh mal deinen Blitz um 90° und du hast ein Problemm. Darum würde ich dir raten so eine Art Billboard zu nützen.

Der einzigste Hacken dabei ist, dass im Billboard Artikel noch nicht beschrieben wird, wie man so ein Ecken Problemm löst.

MfG
Flo


Dieses Problem hab ich bisher erfolgreich verdrängt *g*

Aber du hast Recht. So ganz das ware ist es nicht. Aber den Winkel der Kamera zum Blitz müsste man rausfinden können. Wie's dann allerdings weitergeht, weiß ich auch net. :wink:

Und diese Vektoren, so schön sie zweifellos sind, sind mir nicht ganz geheuer.
Wenn ich als Winkel zwischen den Vektoren (1,0,0) und (0,1,0) 7° herausbekomm, ist das etwas strange. Liegt aber wahrschienlich nicht an den Vektoren, sondern an mir. :D

Wie auch immer. Irgendwo hab ich mal eine Demo gesehen, die einen Blitz zeigte, genauso, wie ich ihn haben will. Die war nur leider mit glScene-Komponenten gemacht und damals dachte ich nicht im Traum daran, sowas zu machen. Und heut find ich die Demo nimmer :cry:

EDIT: Ich hab mir grad den Billboard-Artikel im Wiki angeschaut. Ist ja beängstigend, wie der sich weiterentwickelt hat. Das letzte Mal, als ich da reingeschaut hab, war der grad am Anfang. Und jetzt... :shock:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 09, 2004 14:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zitat:
Und diese Vektoren, so schön sie zweifellos sind, sind mir nicht ganz geheuer.
Wenn ich als Winkel zwischen den Vektoren (1,0,0) und (0,1,0) 7° herausbekomm, ist das etwas strange. Liegt aber wahrschienlich nicht an den Vektoren, sondern an mir.

Schon mal was vom Skalarprodukt gehört?

v1.X*v2.X + v1.Y*v2.Y + v1.Z*v2.Z = cos(Winkel) * |v1| *|v2|


Ob der Weg über den Winkel der schnellste ist, würde ich aber bezweifeln.

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 09, 2004 14:29 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Flo hat geschrieben:
Schon mal was vom Saklarprodukt gehört?

v1.X*v2.X + v1.Y*v2.Y + v1.Z*v2.Z = cos(Winkel) * |v1| *|v2|


Ob der Weg über den Winkel der schnellste ist, würde ich aber bezweifeln.

Ja, vom Skalarprodukt hab ich schonmal was gehört, wie man unschwer am zweiten Post in diesem Thread erkennen kann :roll: . Bzw. das Vektor-Tutorial hier auf DGL gelesen.
Und den Winkel brauch ich auch nur zum Debuggen.

EDIT: Hab den Fehler entdeckt... Die genau falsche Kombination von ArcCos und RadToDeg hat den Fehler verursacht. Ist nun schon das zweite Mal, dass mir das passiert. ^^

EDIT 2:
Kann mir jemand erklären, warum bei Winkel1 90,0000035550306° rauskommt
und bei Winkel2 genau 90°?

Code:
  1. MakeVector(vec1,1,1,0);
  2. MakeVector(vec2,1,-1,0);
  3. Winkel1 := RadToDeg(ArcCos (VectorAngle(vec1, vec2))));
  4. Winkel2 := RadToDeg (ArcCos (VectorDotProduct(vec1,vec2)));


Deklaration der Funktionen aus der geometry.pas:
Code:
  1. {: Calculates the cosine of the angle between Vector1 and Vector2.<p>
  2.    Result = DotProduct(V1, V2) / (Length(V1) * Length(V2)) }
  3. function VectorAngle(const V1, V2: TAffineVector) : Single;
  4.  
  5. {: Calculates the dot product between V1 and V2.<p>
  6.    Result:=V1[X] * V2[X] + V1[Y] * V2[Y] + V1[Z] * V2[Z] }
  7. function VectorDotProduct(const V1, V2 : TAffineVector) : Single; overload;


EDIT 3:
Hab die Demo gefunden:
http://glscene.sourceforge.net/gallery_demos.htm
Die ThorFX-Demo zeigt so einen Blitz, wie ich ihn mir in etwa vorstelle.


Zuletzt geändert von Frase am Do Dez 09, 2004 17:31, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 09, 2004 17:00 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
So. Hab's jetzt hinbekommen. Die merkwürdige Formel "1/cos((180-Winkel(v1,v2)/2)" hat bei mir merkwürdige Resultate geliefert. Ich hab aber einen viel einfacheren Weg gefunden, das zu lösen. Einfach den Differenzvektor normalisieren :wink: .
Schon hat sich das gegessen. Der Differenzvektor bleibt dann auf einer konstanten Länge.

Die konstante Länge hat jedoch den Nachteil, dass bei einem Winkel von 90° auffällt, dass der Pfad nicht gleichbreit ist. Aber das lässt sich notfalls verschmerzen.

Danke für die Hilfe. :wink:


Dateianhänge:
Dateikommentar: Screenshot
vektor.gif
vektor.gif [ 1.65 KiB | 8899-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 09, 2004 22:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Sorry: 1/sin((180-Winkel(v1,v2))/2) !!! Wenn mich nicht alles täuscht :-) Wobei der Winkel nicht der "innere" Winkel, sondern der Winkel zwischen dem 2. Vektor und dem Verlänertem 1. ist.
Äh... kommt also quasie auf die Richtung der Vektoren an, wenn mann dass Skalarprodukt zur Winkelbestimmung benutzt.
Ansonsten 1/sin(Winkel(v1,v2)/2) Aber ist ja auch egal :-)

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.144s | 18 Queries | GZIP : On ]