- function SchnitpunktDistanz(raydir, raypos, vertex1, vertex2, vertex3: TGLVectord3): real;
- var
- edge1, edge2, distanceCrossEdge1, directionCrossEdge2,
- distanceVector: TGLVectord3;
- distance, determinant, inverseDeterminant, triangleU, triangleV: real;
- begin
- edge1[0] := vertex2[0] - vertex1[0];
- edge1[1] := vertex2[1] - vertex1[1];
- edge1[2] := vertex2[2] - vertex1[2];
- edge2[0] := vertex3[0] - vertex1[0];
- edge2[1] := vertex3[1] - vertex1[1];
- edge2[2] := vertex3[2] - vertex1[2];
- directionCrossEdge2[0] := raydir[1] * edge2[2] - raydir[2] * edge2[1];
- directionCrossEdge2[1] := raydir[2] * edge2[0] - raydir[0] * edge2[2];
- directionCrossEdge2[2] := raydir[0] * edge2[1] - raydir[1] * edge2[0];
- determinant := edge1[0] * directionCrossEdge2[0] + edge1[1]
- * directionCrossEdge2[1] + edge1[2] * directionCrossEdge2[2];
- inverseDeterminant := 1 / determinant;
- distanceVector[0] := raypos[0] - vertex1[0];
- distanceVector[1] := raypos[1] - vertex1[1];
- distanceVector[2] := raypos[2] - vertex1[2];
- triangleU := (distanceVector[0] * directionCrossEdge2[0] + distanceVector[1]
- * directionCrossEdge2[1] + distanceVector[2] * directionCrossEdge2[2])
- * inverseDeterminant;
- if (triangleU < 0) or (triangleU > 1) then
- begin
- result := 0;
- exit;
- end;
- distanceCrossEdge1[0] := distanceVector[1] * edge1[2] - distanceVector[2]
- * edge1[1];
- distanceCrossEdge1[1] := distanceVector[2] * edge1[0] - distanceVector[0]
- * edge1[2];
- distanceCrossEdge1[2] := distanceVector[0] * edge1[1] - distanceVector[1]
- * edge1[0];
- triangleV := (raydir[0] * distanceCrossEdge1[0] + raydir[1]
- * distanceCrossEdge1[1] + raydir[2] * distanceCrossEdge1[2])
- * inverseDeterminant;
- if (triangleV < 0) or (triangleV > 1) then
- begin
- result := 0;
- exit;
- end;
- distance := (edge2[0] * distanceCrossEdge1[0] + edge2[1] * distanceCrossEdge1
- [1] + edge2[2] * distanceCrossEdge1[2]) * inverseDeterminant;
- if distance < 0 then
- begin
- result := 0;
- exit;
- end;
- result := distance;
- end;