MCPcopy Create free account
hub / github.com/TheForceEngine/TheForceEngine / lineSegmentSide

Function lineSegmentSide

TheForceEngine/TFE_Polygon/polygon.cpp:317–391  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

315 };
316
317 PointSegSide lineSegmentSide(Vec2f p, Vec2f p0, Vec2f p1)
318 {
319 f32 dx = p0.x - p1.x;
320 f32 dz = p0.z - p1.z;
321 if (dx == 0)
322 {
323 if (dz > 0)
324 {
325 if (p.z < p1.z || p.z > p0.z || p.x > p0.x) { return PS_INSIDE; }
326 }
327 else
328 {
329 if (p.z < p0.z || p.z > p1.z || p.x > p0.x) { return PS_INSIDE; }
330 }
331 return (p.x == p0.x) ? PS_ON_LINE : PS_OUTSIDE;
332 }
333 else if (dz == 0)
334 {
335 if (p.z != p0.z)
336 {
337 // I believe this should be -1 or +1 depending on if z is less than or greater than z0.
338 // Otherwise flat lines always give the same answer.
339 return PS_INSIDE;
340 }
341 if (dx > 0)
342 {
343 return (p.x > p0.x) ? PS_INSIDE : (p.x < p1.x) ? PS_OUTSIDE : PS_ON_LINE;
344 }
345 return (p.x > p1.x) ? PS_INSIDE : (p.x < p0.x) ? PS_OUTSIDE : PS_ON_LINE;
346 }
347 else if (dx > 0)
348 {
349 if (p.x > p0.x) { return PS_INSIDE; }
350
351 p.x -= p1.x;
352 if (dz > 0)
353 {
354 if (p.z < p1.z || p.z > p0.z) { return PS_INSIDE; }
355 p.z -= p1.z;
356 }
357 else
358 {
359 if (p.z < p0.z || p.z > p1.z) { return PS_INSIDE; }
360 dz = -dz;
361 p1.z -= p.z;
362 p.z = p1.z;
363 }
364 }
365 else // dx <= 0
366 {
367 if (p.x > p1.x) { return PS_INSIDE; }
368
369 p.x -= p0.x;
370 dx = -dx;
371 if (dz > 0)
372 {
373 if (p.z < p1.z || p.z > p0.z) { return PS_INSIDE; }
374 p0.z -= p.z;

Callers 1

pointInsidePolygonFunction · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected