...hier erst mal zum Testen für konvexe Polyeder
Code:
EnableExplicit
Procedure PunktInKonvexemPolyeder ( Anzahl.i, Array Indizes.i(2), Array Punkte.f(2), Px.f, Py.f, Pz.f)
Protected i.i
Protected Vx1.d,Vx2.d,Vy1.d,Vy2.d,Vz1.d,Vz2.d,Nx.d,Ny.d,Nz.d,L.d
For i=0 To Anzahl-1
Vx1 = Punkte(Indizes(i,1),0)-Punkte(Indizes(i,0),0) ; \
Vy1 = Punkte(Indizes(i,1),1)-Punkte(Indizes(i,0),1) ; Vektor vom 1. Dreieckspunkt zum 2. Dreieckspunkt
Vz1 = Punkte(Indizes(i,1),2)-Punkte(Indizes(i,0),2) ; /
Vx2 = Punkte(Indizes(i,2),0)-Punkte(Indizes(i,0),0) ; \
Vy2 = Punkte(Indizes(i,2),1)-Punkte(Indizes(i,0),1) ; Vektor vom 1. Dreieckspunkt zum 3. Dreieckspunkt
Vz2 = Punkte(Indizes(i,2),2)-Punkte(Indizes(i,0),2) ; /
Nx = Vy1*Vz2-Vz1*Vy2 ; \
Ny = Vz1*Vx2-Vx1*Vz2 ; Normale des Dreiecks
Nz = Vx1*Vy2-Vy1*Vx2 ; /
Vx1 = Px-Punkte(Indizes(i,0),0) ; \
Vy1 = Py-Punkte(Indizes(i,0),1) ; Vektor vom 1. Dreieckspunkt zum Prüfpunkt
Vz1 = Pz-Punkte(Indizes(i,0),2) ; /
L = Vx1*Nx+Vy1*Ny+Vz1*Nz ; Skalarprodukt
If L > 0.000001
ProcedureReturn -1 ; Punkt ausserhalb
ElseIf L < 0.000001 And L > -0.000001
ProcedureReturn 0 ; Punkt auf der Hülle
EndIf
Next i
ProcedureReturn 1 ; Punkt innerhalb
EndProcedure
Code ist ungetestet. Ich hoffe, die Arrays sind so richtig interpretiert.
Das mit dem allgemeinen Polyeder ist etwas aufwändiger, wird aber noch nachgeliefert.