// intersect lines with plane void Slicer::CalcCuttingPlane(float where, CuttingPlane &plane, const Matrix4f &T) { #if CUTTING_PLANE_DEBUG cout << "intersect with z " << where << "\n"; #endif plane.Clear(); plane.SetZ(where); Vector3f min = T*Min; Vector3f max = T*Max; plane.Min.x = min.x; plane.Min.y = min.y; plane.Max.x = max.x; plane.Max.y = max.y; Vector2f lineStart; Vector2f lineEnd; bool foundOne = false; int num_cutpoints; for (size_t i = 0; i < triangles.size(); i++) { foundOne=false; CuttingPlane::Segment line(-1,-1); num_cutpoints = triangles[i].CutWithPlane(where, T, lineStart, lineEnd); if (num_cutpoints>0) line.start = plane.RegisterPoint(lineStart); if (num_cutpoints>1) line.end = plane.RegisterPoint(lineEnd); // Check segment normal against triangle normal. Flip segment, as needed. if (line.start != -1 && line.end != -1 && line.end != line.start) // if we found a intersecting triangle { Vector3f Norm = triangles[i].Normal; Vector2f triangleNormal = Vector2f(Norm.x, Norm.y); Vector2f segmentNormal = (lineEnd - lineStart).normal(); triangleNormal.normalise(); segmentNormal.normalise(); if( (triangleNormal-segmentNormal).lengthSquared() > 0.2f) // if normals does not align, flip the segment line.Swap(); plane.AddLine(line); } } }