int main(int argc, char* argv[]) { plbInit(&argc, &argv); global::directories().setOutputDir("./"); plint n = 80; // Resolution (cylinder diameter). T radius = (T) n / 2.; // Cylinder radius. Array<T,3> center(0.0, 0.0, 0.0); // Cylinder center. T length = (T) (4 * n); // Cylinder length. plint nAxial = n / 2; // Two parameters needed for the creation of the triangularized cylinder surface. plint nCirc = 3 * n / 2; // Create a cylinder surface as a set of triangles. TriangleSet<T> cylinder; cylinder = constructCylinder<T>(center, radius, radius, length, nAxial, nCirc); cylinder.writeAsciiSTL("cylinder.stl"); // Define the cut plane by a point and a normal vector. Array<T,3> cutPlanePoint(length / 3.3, 0.0, 0.0); Array<T,3> cutPlaneNormal(-1.0, -0.1, -0.5); Plane<T> cutPlane; cutPlane.point = cutPlanePoint; cutPlane.normal = cutPlaneNormal; // Cut the cylinder in two parts. TriangleSet<T> rightCylinderPart; int rv = 0; rv = cylinder.cutWithPlane(cutPlane, rightCylinderPart); if (rv != 1) { pcout << "Problem with the surface cutting." << std::endl; exit(1); } rightCylinderPart.writeAsciiSTL("rightCylinderPart.stl"); TriangleSet<T> leftCylinderPart; cutPlane.normal = -cutPlane.normal; rv = 0; rv = cylinder.cutWithPlane(cutPlane, leftCylinderPart); if (rv != 1) { pcout << "Problem with the surface cutting." << std::endl; exit(1); } leftCylinderPart.writeAsciiSTL("leftCylinderPart.stl"); // Use a cuboid to cut the cylinder (correct usage). Array<T,3> lowerLeftCorner = cutPlanePoint - Array<T,3>(length, 5.0 * radius / 4.0, 5.0 * radius / 4.0); Array<T,3> upperRightCorner = cutPlanePoint + Array<T,3>(length / 4.0, 5.0 * radius / 4.0, 5.0 * radius / 4.0); Cuboid<T> cutCuboid; cutCuboid.lowerLeftCorner = lowerLeftCorner; cutCuboid.upperRightCorner = upperRightCorner; TriangleSet<T> newRightCylinderPart; cutPlane.normal = -cutPlane.normal; rv = 0; rv = cylinder.cutWithPlane(cutPlane, cutCuboid, newRightCylinderPart); if (rv != 1) { pcout << "Problem with the surface cutting." << std::endl; exit(1); } newRightCylinderPart.writeAsciiSTL("newRightCylinderPart.stl"); // Use a cuboid to cut the cylinder (wrong usage). upperRightCorner = cutPlanePoint + Array<T,3>(0.0, radius, radius); cutCuboid.upperRightCorner = upperRightCorner; TriangleSet<T> newBrokenRightCylinderPart; rv = 0; rv = cylinder.cutWithPlane(cutPlane, cutCuboid, newBrokenRightCylinderPart); if (rv != 1) { pcout << "Problem with the surface cutting." << std::endl; exit(1); } newBrokenRightCylinderPart.writeAsciiSTL("newBrokenRightCylinderPart.stl"); return 0; }