Seite 1 von 1

Hilfe bei Gerade schneidet Ebene

Verfasst: 16.09.2013 20:47
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

Re: Hilfe bei Gerade schneidet Ebene

Verfasst: 17.09.2013 22:40
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()

Re: Hilfe bei Gerade schneidet Ebene

Verfasst: 18.09.2013 09:59
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

Re: Hilfe bei Gerade schneidet Ebene

Verfasst: 18.09.2013 10:36
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. :)

Re: Hilfe bei Gerade schneidet Ebene

Verfasst: 18.09.2013 11:23
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