diff options
Diffstat (limited to 'js/helper-classes/3D/StageLine.js')
-rwxr-xr-x | js/helper-classes/3D/StageLine.js | 372 |
1 files changed, 186 insertions, 186 deletions
diff --git a/js/helper-classes/3D/StageLine.js b/js/helper-classes/3D/StageLine.js index 787a4568..d6eea478 100755 --- a/js/helper-classes/3D/StageLine.js +++ b/js/helper-classes/3D/StageLine.js | |||
@@ -120,7 +120,7 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, { | |||
120 | // add the intersection | 120 | // add the intersection |
121 | var dot = MathUtils.dot3( pt0, planeEq ) + planeEq[3]; | 121 | var dot = MathUtils.dot3( pt0, planeEq ) + planeEq[3]; |
122 | var deltaVis = (dot > 0) ? 1 : -1; | 122 | var deltaVis = (dot > 0) ? 1 : -1; |
123 | // if (plane.isBackFacing()) | 123 | // if (plane.isBackFacing()) |
124 | // deltaVis = (dot < 0) ? 1 : -1; | 124 | // deltaVis = (dot < 0) ? 1 : -1; |
125 | 125 | ||
126 | this.addIntersection( plane, t, deltaVis ); | 126 | this.addIntersection( plane, t, deltaVis ); |
@@ -175,14 +175,14 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, { | |||
175 | MathUtils.negate( vec ); | 175 | MathUtils.negate( vec ); |
176 | planeEq = [-vec[1], vec[0], 0]; | 176 | planeEq = [-vec[1], vec[0], 0]; |
177 | var normal = [planeEq[0], planeEq[1], planeEq[2]]; | 177 | var normal = [planeEq[0], planeEq[1], planeEq[2]]; |
178 | // var d = -planeEq.dot(bPt0); | 178 | // var d = -planeEq.dot(bPt0); |
179 | var d = -vecUtils.vecDot(3, planeEq, bPt0); | 179 | var d = -vecUtils.vecDot(3, planeEq, bPt0); |
180 | planeEq[3] = d; | 180 | planeEq[3] = d; |
181 | 181 | ||
182 | t = MathUtils.vecIntersectPlaneForParam( pt0, lineDir, planeEq ); | 182 | t = MathUtils.vecIntersectPlaneForParam( pt0, lineDir, planeEq ); |
183 | if (t) | 183 | if (t) |
184 | { | 184 | { |
185 | if ((MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) // the strict vs not-strict inequality comparisons are IMPORTANT! | 185 | if ((MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) // the strict vs not-strict inequality comparisons are IMPORTANT! |
186 | { | 186 | { |
187 | // get the intersection point | 187 | // get the intersection point |
188 | var pt = MathUtils.interpolateLine3D( pt0, pt1, t ); | 188 | var pt = MathUtils.interpolateLine3D( pt0, pt1, t ); |
@@ -207,184 +207,184 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, { | |||
207 | } | 207 | } |
208 | }, | 208 | }, |
209 | 209 | ||
210 | doCoplanarIntersection: { | 210 | doCoplanarIntersection: { |
211 | value: function( plane ) | 211 | value: function( plane ) |
212 | { | 212 | { |
213 | // get the boundary points for the plane | 213 | // get the boundary points for the plane |
214 | var boundaryPts = plane.getBoundaryPoints(); | 214 | var boundaryPts = plane.getBoundaryPoints(); |
215 | var planeEq = plane.getPlaneEq(); | 215 | var planeEq = plane.getPlaneEq(); |
216 | 216 | ||
217 | if (plane.isBackFacing()) | 217 | if (plane.isBackFacing()) |
218 | { | 218 | { |
219 | var tmp; | 219 | var tmp; |
220 | tmp = boundaryPts[0]; boundaryPts[0] = boundaryPts[3]; boundaryPts[3] = tmp; | 220 | tmp = boundaryPts[0]; boundaryPts[0] = boundaryPts[3]; boundaryPts[3] = tmp; |
221 | tmp = boundaryPts[1]; boundaryPts[1] = boundaryPts[2]; boundaryPts[2] = tmp; | 221 | tmp = boundaryPts[1]; boundaryPts[1] = boundaryPts[2]; boundaryPts[2] = tmp; |
222 | } | 222 | } |
223 | 223 | ||
224 | var pt0 = this.getPoint0(), | 224 | var pt0 = this.getPoint0(), |
225 | pt1 = this.getPoint1(); | 225 | pt1 = this.getPoint1(); |
226 | 226 | ||
227 | // keep a couple flags to prevent counting crossings twice in edge cases | 227 | // keep a couple flags to prevent counting crossings twice in edge cases |
228 | var gotEnter = false, | 228 | var gotEnter = false, |
229 | gotExit = false; | 229 | gotExit = false; |
230 | 230 | ||
231 | var bp1 = boundaryPts[3]; | 231 | var bp1 = boundaryPts[3]; |
232 | for (var i=0; i<4; i++) | 232 | for (var i=0; i<4; i++) |
233 | { | 233 | { |
234 | var bp0 = bp1; | 234 | var bp0 = bp1; |
235 | bp1 = boundaryPts[i]; | 235 | bp1 = boundaryPts[i]; |
236 | var vec = vecUtils.vecSubtract(3, bp1, bp0); | 236 | var vec = vecUtils.vecSubtract(3, bp1, bp0); |
237 | var nrm = vecUtils.vecCross(3, vec, planeEq); | 237 | var nrm = vecUtils.vecCross(3, vec, planeEq); |
238 | nrm[3] = -vecUtils.vecDot(3, bp0, nrm); | 238 | nrm[3] = -vecUtils.vecDot(3, bp0, nrm); |
239 | 239 | ||
240 | var d0 = vecUtils.vecDot(3, nrm, pt0) + nrm[3], | 240 | var d0 = vecUtils.vecDot(3, nrm, pt0) + nrm[3], |
241 | d1 = vecUtils.vecDot(3, nrm, pt1) + nrm[3]; | 241 | d1 = vecUtils.vecDot(3, nrm, pt1) + nrm[3]; |
242 | 242 | ||
243 | var s0 = MathUtils.fpSign(d0), | 243 | var s0 = MathUtils.fpSign(d0), |
244 | s1 = MathUtils.fpSign(d1); | 244 | s1 = MathUtils.fpSign(d1); |
245 | 245 | ||
246 | if (s0 != s1) | 246 | if (s0 != s1) |
247 | { | 247 | { |
248 | var t = Math.abs(d0)/( Math.abs(d0) + Math.abs(d1) ); | 248 | var t = Math.abs(d0)/( Math.abs(d0) + Math.abs(d1) ); |
249 | if (t == 0) | 249 | if (t == 0) |
250 | { | 250 | { |
251 | if (s1 > 0) // entering the material from the beginning of the line that is to be drawn | 251 | if (s1 > 0) // entering the material from the beginning of the line that is to be drawn |
252 | { | 252 | { |
253 | // see if the start point of the line is at a corner of the bounded plane | 253 | // see if the start point of the line is at a corner of the bounded plane |
254 | var lineDir = vecUtils.vecSubtract(3, pt1, pt0); | 254 | var lineDir = vecUtils.vecSubtract(3, pt1, pt0); |
255 | vecUtils.vecNormalize(3, lineDir); | 255 | vecUtils.vecNormalize(3, lineDir); |
256 | var dist = vecUtils.vecDist( 3, pt0, bp1 ); | 256 | var dist = vecUtils.vecDist( 3, pt0, bp1 ); |
257 | var bp2, bv0, bv1, cross1, cross2, cross3; | 257 | var bp2, bv0, bv1, cross1, cross2, cross3; |
258 | if ( MathUtils.fpSign(dist) == 0) | 258 | if ( MathUtils.fpSign(dist) == 0) |
259 | { | 259 | { |
260 | bp2 = boundaryPts[(i+1) % 4]; | 260 | bp2 = boundaryPts[(i+1) % 4]; |
261 | bv0 = vecUtils.vecSubtract(3, bp2, bp1); | 261 | bv0 = vecUtils.vecSubtract(3, bp2, bp1); |
262 | bv1 = vecUtils.vecSubtract(3, bp0, bp1); | 262 | bv1 = vecUtils.vecSubtract(3, bp0, bp1); |
263 | cross1 = vecUtils.vecCross(3, bv0, lineDir); | 263 | cross1 = vecUtils.vecCross(3, bv0, lineDir); |
264 | cross2 = vecUtils.vecCross(3, lineDir, bv1); | 264 | cross2 = vecUtils.vecCross(3, lineDir, bv1); |
265 | cross3 = vecUtils.vecCross(3, bv0, bv1); | 265 | cross3 = vecUtils.vecCross(3, bv0, bv1); |
266 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) | 266 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) |
267 | { | 267 | { |
268 | gotEnter = true; | 268 | gotEnter = true; |
269 | this.addIntersection( plane, t, 1 ); | 269 | this.addIntersection( plane, t, 1 ); |
270 | } | 270 | } |
271 | } | 271 | } |
272 | else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0) | 272 | else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0) |
273 | { | 273 | { |
274 | bp2 = boundaryPts[(i+2) % 4]; | 274 | bp2 = boundaryPts[(i+2) % 4]; |
275 | bv0 = vecUtils.vecSubtract(3, bp2, bp0); | 275 | bv0 = vecUtils.vecSubtract(3, bp2, bp0); |
276 | bv1 = vecUtils.vecSubtract(3, bp1, bp0); | 276 | bv1 = vecUtils.vecSubtract(3, bp1, bp0); |
277 | cross1 = vecUtils.vecCross(3, bv0, lineDir); | 277 | cross1 = vecUtils.vecCross(3, bv0, lineDir); |
278 | cross2 = vecUtils.vecCross(3, lineDir, bv1); | 278 | cross2 = vecUtils.vecCross(3, lineDir, bv1); |
279 | cross3 = vecUtils.vecCross(3, bv0, bv1); | 279 | cross3 = vecUtils.vecCross(3, bv0, bv1); |
280 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) | 280 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) |
281 | { | 281 | { |
282 | gotEnter = true; | 282 | gotEnter = true; |
283 | this.addIntersection( plane, t, 1 ); | 283 | this.addIntersection( plane, t, 1 ); |
284 | } | 284 | } |
285 | } | 285 | } |
286 | else | 286 | else |
287 | { | 287 | { |
288 | // check if the line is on the edge of the boundary or goes to the interior | 288 | // check if the line is on the edge of the boundary or goes to the interior |
289 | gotEnter = true; | 289 | gotEnter = true; |
290 | this.addIntersection( plane, t, 1 ); | 290 | this.addIntersection( plane, t, 1 ); |
291 | } | 291 | } |
292 | } | 292 | } |
293 | } | 293 | } |
294 | else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) | 294 | else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) |
295 | { | 295 | { |
296 | // get the point where the line crosses the edge of the element plane | 296 | // get the point where the line crosses the edge of the element plane |
297 | var pt = MathUtils.interpolateLine3D(pt0, pt1, t ); | 297 | var pt = MathUtils.interpolateLine3D(pt0, pt1, t ); |
298 | 298 | ||
299 | // we know that the line crosses the infinite extension of the edge. Determine | 299 | // we know that the line crosses the infinite extension of the edge. Determine |
300 | // if that crossing is within the bounds of the edge | 300 | // if that crossing is within the bounds of the edge |
301 | var dot0 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp0), vec), | 301 | var dot0 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp0), vec), |
302 | dot1 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp1), vec); | 302 | dot1 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp1), vec); |
303 | if ((MathUtils.fpSign(dot0) > 0) && (MathUtils.fpSign(dot1) < 0)) | 303 | if ((MathUtils.fpSign(dot0) > 0) && (MathUtils.fpSign(dot1) < 0)) |
304 | { | 304 | { |
305 | // determine if the line is entering or exiting | 305 | // determine if the line is entering or exiting |
306 | if (s0 <= 0) // entering | 306 | if (s0 <= 0) // entering |
307 | { | 307 | { |
308 | if (!gotEnter) | 308 | if (!gotEnter) |
309 | { | 309 | { |
310 | gotEnter = true; | 310 | gotEnter = true; |
311 | this.addIntersection( plane, t, 1 ); | 311 | this.addIntersection( plane, t, 1 ); |
312 |