Aktuelle Zeit: 19.09.2019 00:26

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Hilfe bei Gerade schneidet Ebene
BeitragVerfasst: 16.09.2013 20:47 
Offline

Registriert: 06.04.2005 22:44
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/lineare-algebra-und-analytische-geometrie/schnittprobleme/gerade-schneidet-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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Hilfe bei Gerade schneidet Ebene
BeitragVerfasst: 17.09.2013 22:40 
Offline
Benutzeravatar

Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond
Soll der Schnittpunkt auch innerhalb des Dreiecks und innerhalb der Strecke (Gerade) liegen?
...nicht vollständig getestet
Code:
; 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()

_________________
Win8 32Bit / PB 5.10 / PB 5.20


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Hilfe bei Gerade schneidet Ebene
BeitragVerfasst: 18.09.2013 09:59 
Offline

Registriert: 06.04.2005 22:44
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Hilfe bei Gerade schneidet Ebene
BeitragVerfasst: 18.09.2013 10:36 
Offline
Benutzeravatar

Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond
Deine Frage lautete :

Zitat:
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.

Zitat:
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. :)

_________________
Win8 32Bit / PB 5.10 / PB 5.20


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Hilfe bei Gerade schneidet Ebene
BeitragVerfasst: 18.09.2013 11:23 
Offline

Registriert: 06.04.2005 22:44
alter Mann hat geschrieben:
Deine Frage lautete :

Zitat:
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.

Zitat:
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye