Feststellen ob ein Punkt innerhalb eines Dreiecks liegt.



  • "Deine 3D-Deutung ist Humbug"??? 😕
    "Projeziert man anders, kann das Ergebnis auch anders sein."

    Na denn Projeziere doch mal anders.
    Also beim mir funktioniert das alles wunderbar, das kann aber auch an meiner Festplatte liegen oder so.:D

    Gruß ABC++



  • ABC++ schrieb:

    Na denn Projeziere doch mal anders.
    Also beim mir funktioniert das alles wunderbar, das kann aber auch an meiner Festplatte liegen oder so.:D

    solang deine projektion nicht grade zum strich mutiert ist das kein problem ,-) ergo: einfach stur z wegwerfen wird dir sauber schiefgehen, sobald dein dreieck auf der x-z oder y-z ebene liegt (oder allgemein der normalenvektor senkrecht zur z-achse steht). deswegen die koordinate wegwerfen, die bei der dreiecksnormalen am größten ist (oder wenigstens eine, die nicht 0 oder fast 0 ist).

    in 2d brauchts auch kein kreuzprodukt (gibts sowieso nicht), da werden x und y vertauscht, eins der vorzeichen geändert und fertig. und wenn du dabei grundsätzlich das vorzeichen für die neue x-koordinate änderst (und die punkte des dreiecks brav gegen den uhrzeigersinn laufen), dann wird die normale auch immer nach "links" (vom vektor aus) zeigen.

    wenn der winkel zwischen temp1 und temp2 < 180 ist, dann liegt die spitze von temp2 auf der linken seite und das skalarprodukt ist positiv, bei 0 ist der winkel genau 180 und der punkt liegt genau auf der kante (dummerweise unbekannt, ob er nicht trotzdem außerhalb des dreieckes liegt). ist der punkt außerhalb, dann ist irgendein winkel automatisch größer als 180, die spitze liegt auf der falschen seite, das ding wird negativ.

    also sollte das hier genau das gleiche ergebnis liefern:

    if (temp1.x * -temp2.y + temp1.y * temp2.x <= 0) return false;
    if (temp2.x * -temp3.y + temp2.y * temp3.x <= 0) return false;
    if (temp3.x * -temp1.y + temp3.y * temp1.x <= 0) return false;
    return true;

    letztlich die gleiche mathe, nur getrickst, um keine seitennormalen berechnen zu müssen. spart 3 subtraktionen, aber dafür sind punkte, die genau auf einer der drei geraden liegen ungünstig.



  • Ein Dreieck, drei Ergebnisse:

    Projektion auf y-z Ebene => daneben
    Projektion auf x-z Ebene => Treffer
    Projektion auf y-x Ebene => WTF?

    ^y                ^y
    I                 I   _____
    I       /         I   \   I
    I      /          I    \  I
    I     /           I     \ I
    I    /            I      \I
    I                 I
    I     X...........I.....X
    I     :           I
    +------------> x  +------------> z  
          :    
    ^z    :
    I     /I
    I    /:I
    I   / XI
    I  /___I
    I
    +------------> x
    

    Es sind immer Projektionen möglich, die zu einem Treffer führen, z.b. auf die Tangentialebene des Vektors vom Testpunkt zum Mittelpunkt des Innkreises. Die korrekte 3D-Deutung ist ein 3-seitiges Prisma unendlicher Höhe, senkrecht zur Projektionsebene stehend, und kein einfaches Dreieck.

    Bye, TGGC (Dem beste BdT)



  • und jetzt trauen wir doch einfach zur abwechslung mal einem fragesteller zu, daß er kein totaler dummbeutel ist und den schnitt zwischen gerade und ebene schon längst berechnet hat und für eben diesen den test braucht.



  • dann würde aber jeder vorteil durch die obere version schon im keim erstickt wereden, da der vergleich malwieder kostet-.-



  • TGGC
    ich habe keine Ahnung für welche merkwürdigen Vergleiche du solche Berechnungen brauchst. Bei mir Jedenfalls wird vorher der Schnittpunkt mit der Dreiecksebene berechnet. Auf deutsch der Punkt liegt in einer Ebene mit dem Dreieck und dann passt es (wie auch sonst).
    Also keine Panik!

    Trienco
    "solang deine projektion nicht grade zum strich mutiert ist das kein problem ,-) ergo: einfach stur z wegwerfen wird dir sauber schiefgehen,"

    das ist soweit richtig. Aber durch zwei if abfragen kann man festellen in welchen Quadranten die Rechnung passt und setzt dann z.B: für z den x Wert und x den z Wert .
    Aber wie gesagt ich berechne vorher einen Schnittpunkt mit der Dreieckseben und weiß daher das das Dreieck nicht senkrecht steht.

    "
    if (temp1.x * -temp2.y + temp1.y * temp2.x <= 0) return false;
    if (temp2.x * -temp3.y + temp2.y * temp3.x <= 0) return false;
    if (temp3.x * -temp1.y + temp3.y * temp1.x <= 0) return false;"

    Wenn die Eckpunkte in Unterschieden Quadranten liegen (z.B. temp2.x negativ) das passt deine Rechnung nicht mehr (meine schon).



  • ABC++ schrieb:

    Wenn die Eckpunkte in Unterschieden Quadranten liegen (z.B. temp2.x negativ) das passt deine Rechnung nicht mehr (meine schon).

    *rechne, mal, pinsel*
    ok, nach links zeigt es immer *weiterpinsel*
    unabhängig vom quadranten bleibt das skalarprodukt bis 180° positiv. solang meine drehrichtung stimmt sollte da nichts passieren. hat natürlich den nachteil, daß ich bei der projektion zusätzlich aufpassen muß, daß ich von "vorn" draufsehe oder die reihenfolge umkehre. klingt spontan nach mehr aufwand als es wert ist.

    muß jetzt doch mal nen stapel testfälle durch den profiler jagen *g*

    edit: so, nach ein bißchen rumspielen und ohne den overhead für rdtsc rauszuwerfen (und mit ein wenig meßungenauigkeit und zig tests, die +-3 ticks ausgefallen sind):

    mit seitennormalen und:
    if (a.x*n1.x + a.y*n1.y < 0) return 0;
    if (b.x*n2.x + b.y*n2.y < 0) return 0;
    if (c.x*n3.x + c.y*n3.y < 0) return 0;
    return 1;

    227 ticks (die variationen mit 231 und 235 minimal langsamer, einmal t1 bis t3 mit 0 vergleichen, einmal siehe unten)

    deine methode und:
    float d1=b.y*a.x - b.x*a.y;
    float d2=c.y*b.x - c.x*b.y;
    float d3=a.y*c.x - a.x*c.y;
    return (t1*t2<0 || t2*t3<0) ? 0 : 1;

    220 ticks (die andere mit 265 etwas langsamer)

    also in kurz: vollkommen uninteressante unterschiede, wenn der compiler erstmal mit dem code fertig ist.



  • @Trienco: Würde er das machen, wäre er ein Dummbeutel.

    @ABC++: Warum fragst du dann nicht gleich nach Gerade<->Dreieck? Das ist einfacher als erst den Schnitt mit der Dreiecksebene und dann noch Punkt in Dreieck.

    Bye, TGGC (Dem beste BdT)



  • TGGC schrieb:

    @Trienco: Würde er das machen, wäre er ein Dummbeutel.

    und deine alternative, die ähnlich frühzeitig wie die schnittbestimmung abbrechen kann ist welche?



  • Trienco schrieb:

    und deine alternative[...]?

    Wie ich bereits sagte: ein Gerade<->Dreieck Test. Bitte lies meine Posts.

    Bye, TGGC (Dem beste BdT)



  • TGGC schrieb:

    Trienco schrieb:

    und deine alternative[...]?

    Wie ich bereits sagte: ein Gerade<->Dreieck Test. Bitte lies meine Posts.

    wieder eine der genialen nicht-antworten. so ziemlich JEDER test, vom popel-tutorial bis zum buch von eberly schneidet dafür erstmal die gerade mit der ebene. und mit plücker läuft höchstens was, wenn du jetzt krampfhaft auf die gerade bestehst und den üblichen fall von linien oder meinetwegen strahlen ignorierst.



  • Dann irren die Schreiber der Tutorials und Bücher. Die Berechnung der kartesischen Koordinaten des Schnittpunktes ist unnötig, um zu wissen, ob eine Gerade das Dreieck schneidet. Definiere: "Linie"!

    Bye, TGGC (Dem beste BdT)



  • ich gebs auf. das "ich weiß es viel besser, aber ich verrat euch nichts"-schema gekoppelt mit "ich häng mich gerne an begrifflichkeiten auf, die nicht 120% nach der mathematischen definition benutzt werden, um die frage nicht beantworten zu müssen" ist extrem ermüdend.



  • Trienco schrieb:

    ich gebs auf. das "ich weiß es viel besser, aber ich verrat euch nichts"-schema

    Klar, weil der Geraden/Dreieck Schnitt auch das Top Secret Geheimnis ist. Pass auf, die CIA liest hier mit...

    Bye, TGGC (Dem beste BdT)



  • TGGC schrieb:

    Klar, weil der Geraden/Dreieck Schnitt auch das Top Secret Geheimnis ist. Pass auf, die CIA liest hier mit...

    na, dann wärs ja wohl kein akt es zu umreißen oder nen link zu präsentieren, aber nachdem von dir ja zu 80% nur vage antworten kommen, die keiner sau weiterhelfen und entweder zeigen sollen, daß du ganz toll oder der andere total ahnungslos ist, sollte man vermutlich einfach keine konstruktiven beiträge von dir erwarten. die restlichen 20% kann man dann unter trollbashing abhaken.



  • *gähn*
    Trienco, du wirst langsam langweilig-.-



  • Ich finde Trienco,
    hat sich wenigstens um eine vernünftige Diskussion bemüht.
    Im diesem Sinne noch mal Danke.

    Gruß ABC++



  • Trienco schrieb:

    entweder zeigen sollen, daß du ganz toll

    Das brauch man nicht zeigen, das ist einfach.

    Bye, TGGC (Dem beste BdT)


Anmelden zum Antworten