parent
cb58710187
commit
030f522d58
@ -0,0 +1,71 @@ |
|||||||
|
```function triangleClipAgainstPlane(planeP, planeN, inTri) { |
||||||
|
var outTri1 = Tri(), outTri2 = Tri(); |
||||||
|
|
||||||
|
planeN = normVector(planeN); |
||||||
|
|
||||||
|
var d = function(p) { |
||||||
|
p = normVector(p); |
||||||
|
return(dotVector(planeN, p) - dotVector(planeN, planeP)); |
||||||
|
}; |
||||||
|
|
||||||
|
var inside_points = Tri(), |
||||||
|
nInsidePointCount = 0; |
||||||
|
var outside_points = Tri(), |
||||||
|
nOutsidePointCount = 0; |
||||||
|
|
||||||
|
var d0 = d(inTri[0]); |
||||||
|
var d1 = d(inTri[1]); |
||||||
|
var d2 = d(inTri[2]); |
||||||
|
|
||||||
|
if (d0 >= 0) { |
||||||
|
inside_points[nInsidePointCount] = inTri[0]; |
||||||
|
nInsidePointCount++; |
||||||
|
} else { |
||||||
|
outside_points[nOutsidePointCount] = inTri[0]; |
||||||
|
nOutsidePointCount++; |
||||||
|
} |
||||||
|
if (d1 >= 0) { |
||||||
|
inside_points[nInsidePointCount] = inTri[1]; |
||||||
|
nInsidePointCount++; |
||||||
|
} else { |
||||||
|
outside_points[nOutsidePointCount] = inTri[1]; |
||||||
|
nOutsidePointCount++; |
||||||
|
} |
||||||
|
if (d2 >= 0) { |
||||||
|
inside_points[nInsidePointCount] = inTri[2]; |
||||||
|
nInsidePointCount++; |
||||||
|
} else { |
||||||
|
outside_points[nOutsidePointCount] = inTri[2]; |
||||||
|
nOutsidePointCount++; |
||||||
|
} |
||||||
|
if (nInsidePointCount === 0) { |
||||||
|
return [0]; |
||||||
|
} |
||||||
|
|
||||||
|
if (nInsidePointCount === 3) { |
||||||
|
outTri1 = inTri; |
||||||
|
|
||||||
|
return [1, [[outTri1[0], outTri1[1], outTri1[2]]]]; |
||||||
|
} |
||||||
|
|
||||||
|
if (nInsidePointCount === 1 && nOutsidePointCount === 2) { |
||||||
|
outTri1[0] = inside_points[0]; |
||||||
|
|
||||||
|
outTri1[1] = planeIntersectVector(planeP, planeN, inside_points[0], outside_points[0]); |
||||||
|
outTri1[2] = planeIntersectVector(planeP, planeN, inside_points[0], outside_points[1]); |
||||||
|
|
||||||
|
return [1, [[outTri1[0], outTri1[1], outTri1[2]]]]; |
||||||
|
} |
||||||
|
|
||||||
|
if (nInsidePointCount === 2 && nOutsidePointCount === 1) { |
||||||
|
outTri1[0] = inside_points[0]; |
||||||
|
outTri1[1] = inside_points[1]; |
||||||
|
outTri1[2] = planeIntersectVector(planeP, planeN, inside_points[0], outside_points[0]); |
||||||
|
|
||||||
|
outTri2[0] = inside_points[1]; |
||||||
|
outTri2[1] = outTri1[2]; |
||||||
|
outTri2[2] = planeIntersectVector(planeP, planeN, inside_points[1], outside_points[0]); |
||||||
|
|
||||||
|
return [2, [[outTri1[0], outTri1[1], outTri1[2]], [outTri2[0], outTri2[1], outTri2[2]]]]; |
||||||
|
} |
||||||
|
};``` |
Loading…
Reference in new issue