Hilfe bei Gerade schneidet Ebene

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Hilfe bei Gerade schneidet Ebene

Beitrag von Joshua314 »

Hallo Zusammen,
ich hänge hier an einem Problem für eine CNC Anwendung.
wer kann mir bei der Erstellung einer Procedure helfen, die
einen Schnittpunkt einer Geraden durch eine Ebene berechnet.
Ich habe, das http://www.rither.de/a/mathematik/linea ... det-ebene/ gefunden. Hab das in der schule nie gelernt.

Was ich habe ist die Gerade mit 2 Punkten je x,y,z
und einer Fläche(Dreieck) 3 Punkte je x,y,z.

Schön wäre, wenn die Procedure als Ergebnis zb. -1 Schneidet nicht 0 für liegt parallel und 1 schneidet in Punkt
zurück gibt. und dabei eventuell die Koordinate bei einem Zeiger reinschreibt....

Schaut mal wer mir helfen kann..

Danke....

Gruß Thomas
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Hilfe bei Gerade schneidet Ebene

Beitrag von alter Mann »

Soll der Schnittpunkt auch innerhalb des Dreiecks und innerhalb der Strecke (Gerade) liegen?
...nicht vollständig getestet

Code: Alles auswählen

; Eingabe :
; iMod = 0 Schnittpunkt zwischen Gerade und Ebene
; iMod = 1 Schnittpunkt muss innerhalb des Dreiecks liegen
; iMod = 2 Schnittpunkt muss innerhalb der Strecke liegen
; iMod = 3 Schnittpunkt muss innerhalb des Dreiecks und innerhalb der Strecke liegen
; dGx1.... 1.Punkt der Strecke/Geraden
; dGx2.... 2.Punkt der Strecke/Geraden
; dDx1.... 1.Punkt des Dreiecks
; dDx2.... 1.Punkt des Dreiecks
; dDx3.... 1.Punkt des Dreiecks
; Ausgabe :
; Rückkehrwert = 0 - kein Schnittpunkt
;              = 1 - Schnittpunkt vorhanden
; *dSx... Schnittpunkt
Procedure.i StreckeSchneidetDreieck(iMode.i,dGx1.d,dGy1.d,dGz1.d,dGx2.d,dGy2.d,dGz2.d,dDx1.d,dDy1.d,dDz1.d,dDx2.d,dDy2.d,dDz2.d,dDx3.d,dDy3.d,dDz3.d,*dSx.Double,*dSy.Double,*dSz.Double)
  Protected dVGx.d=dGx1-dGx2, dVGy.d=dGy1-dGy2, dVGz.d=dGz1-dGz2
  Protected dVD1x.d=dDx2-dDx1, dVD1y.d=dDy2-dDy1, dVD1z.d=dDz2-dDz1 
  Protected dVD2x.d=dDx3-dDx1, dVD2y.d=dDy3-dDy1, dVD2z.d=dDz3-dDz1 
  Protected dDet.d=dVD1x*(dVD2y*dVGz-dVGy*dVD2z)+dVD2x*(dVGy*dVD1z-dVD1y*dVGz)+dVGx*(dVD1y*dVD2z-dVD1z*dVD2y)
  Protected dS.d,dT.d,dU.d, dVPx.d,dVPy.d,dVPz.d
  
  If Abs(dDet) < 0.0000001
    ProcedureReturn 0 ; Gerade (nahezu) parallel zur Dreiecks-Ebene
  EndIf
  dDet = 1.0 / dDet
  dVPx = dGx1-dDx1
  dVPy = dGy1-dDy1
  dVPz = dGz1-dDz1
  If iMod&1
    dS = (dVPx*(dVD2y*dVGz-dVGy*dVD2z)+dVD2x*(dVGy*dVPz-dVPy*dVGz)+dVGx*(dVPy*dVD2z-dVPz*dVD2y))*dDet
    dT = (dVD1x*(dVPy*dVGz-dVGy*dVPz)+dVPx*(dVGy*dVD1z-dVD1y*dVGz)+dVGx*(dVD1y*dVPz-dVD1z*dVPy))*dDet
    If dS < 0.0 Or dS > 1.0 Or dT < 0.0 Or dT > 1.0 Or dS+dT > 1.0
      ProcedureReturn 0 ; Schnittpunkt liegt ausserhalb des Dreiecks
    EndIf
  EndIf
  dU = (dVD1x*(dVD2y*dVPz-dVPy*dVD2z)+dVD2x*(dVPy*dVD1z-dVD1y*dVPz)+dVPx*(dVD1y*dVD2z-dVD1z*dVD2y))*dDet
  If iMod&2
    If dU < 0.0 Or dU > 1.0
      ProcedureReturn 0 ; Schnittpunkt liegt ausserhalb der Strecke
    EndIf
  EndIf
  *dSx\d = dGx1 - dU * dVGx
  *dSy\d = dGy1 - dU * dVGy
  *dSz\d = dGz1 - dU * dVGz
  ProcedureReturn 1
EndProcedure

Procedure Main()
  Protected iS.i
  Protected dSx.d,dSy.d,dSz.d
  
  iS = StreckeSchneidetDreieck(0, 0.5,0.5,-1., 0.,0.,1., 0.,0.,0., 1.,0.,0., 0.,1.,0., @dSx,@dSy,@dSz)
  Debug Str(iS)
  If iS
    Debug "X="+StrD(dSx)+" Y="+StrD(dSy)+" Z="+StrD(dSz)
  EndIf
  
  iS = StreckeSchneidetDreieck(0, 0.5,0.5,1., 0.,0.,1., 0.,0.,0., 1.,0.,0., 0.,1.,0., @dSx,@dSy,@dSz)
  Debug Str(iS)
  If iS
    Debug "X="+StrD(dSx)+" Y="+StrD(dSy)+" Z="+StrD(dSz)
  EndIf
  
EndProcedure

Main()
Win11 64Bit / PB 6.0
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Hilfe bei Gerade schneidet Ebene

Beitrag von Joshua314 »

Hallo alter Mann,

erst mal herlichen Dank für die Mühe.
alter Mann hat geschrieben:Soll der Schnittpunkt auch innerhalb des Dreiecks und innerhalb der Strecke (Gerade) liegen?
...nicht vollständig getestet
Ich habe deine Frage leider nicht ganz verstanden.
Mir geht es um die Tatsache, dass ich einen 3D Körper im Raster abtasten will. Dieser besteht eben aus lauter kleinen Dreiecksflächen (STL-Datei).
Die Abtastung erfolgt durch die Gerade(Abtastgerade) durch die Fläche(Dreieck). Mich interessieren eben alle Punkte, wo die gedachte Gerade so ein Dreieck trifft.
Das kann in der Fläche sein oder eben genau auf der Kante der Fläche.
Wenn es irgendwo in der Fläche( incl Flächen-Kanten)einen Schnittpunkt gibt, ist für mich dieser Schnittpunkt in der Dreicksfläche wichtig.
Wenn die Fläche nicht getroffen wird -> ok.
Wenn die Abtast-Gerade genau auf der Fläche(Dreieck) liegt muss ich die beiden höchsten Z Werte nehmen, schauen wo die Abtast-Gerade diese Dreieckskantengerade kreuzt und diesen Punkt als Abtastpunkt nehmen.

So mein Überlegung.

Sprich ich verstehe auch nicht ganz, was du mit deinen iMod beschreiben willst.

Gruß Thomas
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Hilfe bei Gerade schneidet Ebene

Beitrag von alter Mann »

Deine Frage lautete :
einen Schnittpunkt einer Geraden durch eine Ebene berechnet
Deswegen meine Frage, ob es sich um die Ebene, in der das Dreieck liegt, handelt oder das Dreieck selber.
Die Frage ist beantwortet.

Das iMod ist ein Flag, das eben diesen Sachverhalt behandelt. Nach Deiner Aufgabenstellung müsste es auf 1 gestellt weden (Schnittpunkt innerhalb / auf dem Rand) des Dreiecks.
Die 2 Punkte also eine Gerade(Abtaststrahl) darstellen und nicht die Strecke. Es gibt ja auch den Fall, dass man nur einen Schnittpunkt berechnet haben will, wenn er "innerhalb" der 2 Punkte liegt. Da das nicht der Fall ist scheidet der Fall aus iMod auf 3 zu setzen.
Wenn die Abtast-Gerade genau auf der Fläche(Dreieck) liegt muss ich die beiden höchsten Z Werte nehmen, schauen wo die Abtast-Gerade diese Dreieckskantengerade kreuzt und diesen Punkt als Abtastpunkt nehmen.
Das ist eigentlich nicht nötig, wenn der Körper vollständig beschrieben ist, denn dann gibt es immer ein Dreieck an der Kante, dass nicht parallel zum Abtaststrahl liegt.
Falls Du dafür auch noch Hilfe brauchst, immer nachfragen. :)
Win11 64Bit / PB 6.0
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Hilfe bei Gerade schneidet Ebene

Beitrag von Joshua314 »

alter Mann hat geschrieben:Deine Frage lautete :
einen Schnittpunkt einer Geraden durch eine Ebene berechnet
Deswegen meine Frage, ob es sich um die Ebene, in der das Dreieck liegt, handelt oder das Dreieck selber.
Die Frage ist beantwortet.

Das iMod ist ein Flag, das eben diesen Sachverhalt behandelt. Nach Deiner Aufgabenstellung müsste es auf 1 gestellt weden (Schnittpunkt innerhalb / auf dem Rand) des Dreiecks.
Die 2 Punkte also eine Gerade(Abtaststrahl) darstellen und nicht die Strecke. Es gibt ja auch den Fall, dass man nur einen Schnittpunkt berechnet haben will, wenn er "innerhalb" der 2 Punkte liegt. Da das nicht der Fall ist scheidet der Fall aus iMod auf 3 zu setzen.
Wenn die Abtast-Gerade genau auf der Fläche(Dreieck) liegt muss ich die beiden höchsten Z Werte nehmen, schauen wo die Abtast-Gerade diese Dreieckskantengerade kreuzt und diesen Punkt als Abtastpunkt nehmen.
Das ist eigentlich nicht nötig, wenn der Körper vollständig beschrieben ist, denn dann gibt es immer ein Dreieck an der Kante, dass nicht parallel zum Abtaststrahl liegt.
Falls Du dafür auch noch Hilfe brauchst, immer nachfragen. :)

Jetzt ist alles klar ...
Nochmals Danke...

Jetzt kann ich das PRG angreifen... Denn dies war der letzte Punkt ohne den ich nicht anfangen brauchte....
Falls noch Probleme Auftauchen melde ich mich halt noch mal...
Mit dem Ergebnis übrigens auch...

Gruß Thomas
Antworten