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

Aktuelle Zeit: So Jun 16, 2024 00:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Feb 02, 2006 17:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 02, 2006 22:37
Beiträge: 39
Wohnort: Köln
Hallo :)

Ich hab ein kleineres Mathematikproblem. Ich habe ein Dreieck im 3D-Raum und möchte nun per "Zufall" einen Punkt auswählen der genau AUF dem Dreieck liegt. Ich hab zuerst versucht es im 2D-Raum zu lösen, doch selbst dafür hab ich zu wenig Kenntnisse. Welche Möglichkeiten gibt es in diesem Fall? Klar, Trigonomie doch welche funktionen? Ein kleiner Denkanstoß wär nett. :)

-Malax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 18:03 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Bitte lasst mich die Antwort posten ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 18:16 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Mit dem Problem hab ich mich selber mal befasst und auch tatsächlich ne Lösung gefunden ;)

Mit Trigonometrie hat meine Vorgehensweise nix zu tun, dafür aber mit interpolation...:

Du hast ein Dreieck ABC.
Code:
  1. C
  2.  +
  3.  |\
  4.  | \
  5.  |  \
  6.  +---+
  7. A      B

Das muss nicht rechtwinklig sein... War nur einfacher in ASCII-Art zu zeichnen ;)

Überlegen wir uns eine Schreibweise, wie wir einen Punkt auf dem Dreieck angeben können. Hierfür bietet sich eine X- und eine Y-Koordinate an, die zwischen 0 und 1 definiert sind...

Dadurch liegt der Punkt (0.5, 0.5) genau in der Mitte von dem Dreieck und dadurch übrigens auch in der Mitte von der Hypothenuse BC ;)

Doch wie berechnet man das jetzt? Ist im Prinzip ganz easy:

Code:
  1. function RelToAbs(DotA, DotB, DotC, Relative: TVertex): TVertex;
  2. var
  3.   DotD: TVertex;
  4.   AC: TVertex;
  5. begin
  6.   VectorSubtract(DotC, DotA, AC); // AC = C-A
  7.   VectorAdd(DotB, AC, DotD); // DotD = B+AC
  8.   VectorLerp(VectorLerp(DotA, DotB, Relative[0]), VectorLerp(DotC, DotD, Relative[0]), Relative[1], Result);;
  9. end;


Dieser Funktion (nutzt die geometry.pas) übergibst du als DotA den Punkt A deines Dreieckes. Gleiches natürlich für DotB und DotC. Spannend wird's bei Relative... Relative ist ein Vektor, der die relative Position enthält.

Beispielaufruf für unser Beispiel:
Code:
  1. var
  2.   Abs, Rel: TVector;
  3. begin
  4.   MakeVector(Rel, 0.5, 0.5, 0);
  5.   Abs := RelToAbs(A, B, C, Rel);
  6.   glVertex3f(Abs[0], Abs[1], Abs[2]);
  7. end;


Und der Ruf nach dem Zufall soll auch gestillt werden *g*:

Code:
  1. var
  2.   Abs, Rel: TVector;
  3. begin
  4.   MakeVector(Rel, random, random, 0);
  5.   Abs := RelToAbs(A, B, C, Rel);
  6.   glVertex3f(Abs[0], Abs[1], Abs[2]);
  7. end;


Bei der Methode (übrigens alles auf meinem eigenen Mist gewachsen. Deswegen gibt es wahrscheinlich effektivere Lösungen als die *g*) musst du allerdings aufpassen. Denn sie nimmt ein Dreieck entgegen, behandelt es aber quasi als Viereck. Deshalb wirst du auch Punkte bekommen, die nicht unbedingt im Dreieck liegen, wohl aber auf der Ebene. Das lässt sich aber ebenfalls sehr leicht beseitigen und sollte daher kein Problem darstellen ;)
Und zwar so, wenn mich nicht alles täuscht:
Wenn die Summe von dem relativen X und dem relativen Y < 1 ist, dann liegt der Punkt im Dreieck. Ist er größer als 1, liegt er außerhalb.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Zuletzt geändert von Frase am Do Feb 02, 2006 19:35, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 19:13 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Hab deinen Code nur kurz überflogen und nicht ganz nachvollzogen, aber warum nutzt du nicht einfach ein barycentrisches Koordinatensystem? Is meiner Meinung nach um einiges kürzer und einfacher...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 19:19 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
AL hat geschrieben:
Hab deinen Code nur kurz überflogen und nicht ganz nachvollzogen, aber warum nutzt du nicht einfach ein barycentrisches Koordinatensystem? Is meiner Meinung nach um einiges kürzer und einfacher...

bary... was?

€dit:
Keine Ahnung, was daran einfacher sein soll ^^

oder daran...
oder auch daran ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 20:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 02, 2006 22:37
Beiträge: 39
Wohnort: Köln
Erstmal danke für die Antworten! :)

Frase hat geschrieben:
Deshalb wirst du auch Punkte bekommen, die nicht unbedingt im Dreieck liegen, wohl aber auf der Ebene. Das lässt sich aber ebenfalls sehr leicht beseitigen und sollte daher kein Problem darstellen.

Sollte es nicht? :roll: Nun, ich hab jetzt nicht so wirklich eine Idee wie man das berechnen könnte. :oops:
Ich hätte damals in Mathe aufpassen sollen. :(

Al, kannst du mal ein Beispiel dazu Posten wie man sowas umsetzen würde? Wikipedia und Co sind so verdammt Mathematisch, das ich noch nichteinmal die Hälfte der Begriffe kenne die da zum erklären genutzt werden ;-)

-Malax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 21:10 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Malax hat geschrieben:
Erstmal danke für die Antworten! :)

Frase hat geschrieben:
Deshalb wirst du auch Punkte bekommen, die nicht unbedingt im Dreieck liegen, wohl aber auf der Ebene. Das lässt sich aber ebenfalls sehr leicht beseitigen und sollte daher kein Problem darstellen.

Sollte es nicht? :roll: Nun, ich hab jetzt nicht so wirklich eine Idee wie man das berechnen könnte. :oops:
Ich hätte damals in Mathe aufpassen sollen. :(

Al, kannst du mal ein Beispiel dazu Posten wie man sowas umsetzen würde? Wikipedia und Co sind so verdammt Mathematisch, das ich noch nichteinmal die Hälfte der Begriffe kenne die da zum erklären genutzt werden ;-)

-Malax

Hab' ich doch geschrieben ;):
Zitat:
Und zwar so, wenn mich nicht alles täuscht:
Wenn die Summe von dem relativen X und dem relativen Y < 1 ist, dann liegt der Punkt im Dreieck. Ist er größer als 1, liegt er außerhalb.


Meine Methode funktioniert auf jeden Fall und ist auch schnell ;) Und imho wesentlich einfacher als dieses Koordinatensystem.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 21:34 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Das is eigentlich gar nicht so schwer. Wenn du 3 Punkte hast, A, B, C, dann kannst du einen Punkt x Beschreiben als X = e*A + f*B + g*C. Man kann es als eine Art Gewichtung der 3 Ecken ansehen. Wenn nun 0 <= e, f, g <= 1 und e+f+g = 1 dann liegt der Punkt drin.
Mit anderen Worten, wenn du nen Punkt in deinem Dreieck willst, dann such die für e ne Zahl zwischen 0 und 1, such dir für f ne Zahl zwischen 0 und 1-e und Berechne X = e*A + f*B + (1-e-f)*C.

Ob sich die Punkte auch gleichmäßig verteilen weiß ich nicht, dass müsste man sich mal überlegen, und dann evtl. mit nem bisschen Exponentieren ausgleichen.

Oh, und der englische Wikipedia-Artikel geht doch eigentlich.

[Edit] hier is noch ne andere Beschreibung, die etwas weniger mathematisch ist: http://www.devmaster.net/articles/raytr ... /part7.php

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Zuletzt geändert von AL am Do Feb 02, 2006 21:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 21:35 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Dann ist meine Methode definitiv einfacher ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 22:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 02, 2006 22:37
Beiträge: 39
Wohnort: Köln
Das würde ich noch nichtmal sagen, ich find diese "Gewichtungskoordinaten" eigendlich ziemlich "sexy". Schön elegant imho. Ich danke euch beiden schon einmal, vllt kommt beim Implementieren noch eine Frage auf, dann stelle ich sie hier wieder :D

-Malax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 22:03 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich hab doch auch bei meiner Methode Gewichtungskoordinaten. Nur heißen sie anders ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 22:12 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
:?
Hey, sry Frase, wenn ich dich irgendwie Angegriffen habe. So wars nicht gemeint.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 22:13 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Was? ne. So meinte ich das doch gar nicht ;)

Ich finde meine Methode dennoch einfacher ;) Und vor allem hab ich sie mir selber ausgedacht *g* Darf man denn nicht auch auf die kleinen Dinge im Leben stolz sein? ^^

Dieses Koordinatensystem klingt zwar ganz interessant, ist aber für diese Anwendung imho Overkill. Ein einfaches Interpolieren tut's da genauso und auch die Prüfung, ob die relativen Koordinaten (Was ja mein Pendant zu dieser Gewichtung ist) im Dreieck sind oder im, an der Hypothenuse gespiegelten, Dreieck, ist mit einem einfach X+Y < 1 nen ganzen Schluck einfacher als die Herangehensweise mit diesen Koordinaten ;) Finde ich persönlich jedenfalls ^^

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Zuletzt geändert von Frase am Do Feb 02, 2006 22:16, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Also ich würde das so machen:

Für meine Lösung die drei Vektoren:
Vektor A zu dem ersten Punkt.
Vektor AB der von A nach B geht. (also einfach von Vektor B Vektor A abziehen )
Vektor AC der von A nach C geht. (also einfach von Vektor C Vektor A abziehen )

Um einen Punkt auf dem Dreieck zu finden rechnest du einfach:

Code:
  1.  
  2. zufallszahl1 := random();
  3. zufallszahl2 := random()*(1-zufallszahl1);// ungetestet - von mir erdachte Möglichkeit um es von einem Viereck auf ein Dreieck zu reduzieren.
  4. position := VektorA + zufallszahl1 * VektorAB + zufallszahl2 * VektorAC
  5.  


Die Punkte müssten dann gleichmäßig auf dem Dreieck verteilt liegen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 22:18 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Genau Flo. Das ist ja "meine" Methode. Nur um längen kürzer erklärt ^^ Ich schweife halt gerne etwas aus ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.180s | 17 Queries | GZIP : On ]