Библиотека clipper не отрабатывает

Есть имеется 2 квадрата, один квадрат 10 на 10, второй 5x5 и находится он по середине в первом.

Необходимо вырезать из квадрата 10x10 второй квадрат 5x5, чтобы в первом квадрате было отверстие размером с 2 квадрат После этого создать 3D модель в формате gltf. Обязательно использовать библиотеку Clipper или Clipper2, а так же библиотеку SharpGLTF. Можно использовать библиотеку для триангуляции Poly2Tri.

List<IntPoint> square1 = new List<IntPoint>
{
    new IntPoint(0, 0),
    new IntPoint(10000, 0),
    new IntPoint(10000, 10000),
    new IntPoint(0, 10000)
};
 
List<IntPoint> square2 = new List<IntPoint>
{
    new IntPoint(2500, 2500),
    new IntPoint(7500, 2500),
    new IntPoint(7500, 7500),
    new IntPoint(2500, 7500)
};
 
var material = new MaterialBuilder("PCB_Material")
    .WithDoubleSide(true)
    .WithMetallicRoughnessShader()
    .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1.0f, 1f, 1.0f, 0));
 
 
var meshBuilder = new MeshBuilder<VertexPosition>("PCB_Mesh");
 
ClipperLib.Clipper clipper = new ClipperLib.Clipper();
 
clipper.AddPolygon(square1, PolyType.ptSubject);
clipper.AddPolygon(square2, PolyType.ptClip);
 
 
List<List<IntPoint>> solution = new List<List<IntPoint>>();
clipper.Execute(ClipperLib.ClipType.ctDifference, solution, PolyFillType.pftEvenOdd, PolyFillType.pftNonZero);
 
foreach (var path in solution)
{
    Console.WriteLine("Path:");
    foreach (var point in path)
    {
        Console.WriteLine($"({point.X}, {point.Y})");
    }
}
 
var polygons = new List<Polygon>();
foreach (var path in solution)
{
    var points = new List<PolygonPoint>();
    foreach (var point in path)
    {
        points.Add(new PolygonPoint(point.X, point.Y));
    }
    polygons.Add(new Polygon(points));
}
 
var triangles = new List<DelaunayTriangle>();
foreach (var polygon in polygons)
{
    P2T.Triangulate(polygon);
    triangles.AddRange(polygon.Triangles);
}
 
var material1 = new MaterialBuilder("PCB_Material1")
    .WithDoubleSide(true)
    .WithMetallicRoughnessShader()
    .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1.0f, 0.0f, 1.0f, 1.0f));
 
 
var index = 0;
 
foreach (var triangle in triangles)
{
    var v0 = new VertexPosition((float)triangle.Points[0].X / 1000.0f, (float)triangle.Points[0].Y / 1000.0f, 0);
    var v1 = new VertexPosition((float)triangle.Points[1].X / 1000.0f, (float)triangle.Points[1].Y / 1000.0f, 0);
    var v2 = new VertexPosition((float)triangle.Points[2].X / 1000.0f, (float)triangle.Points[2].Y / 1000.0f, 0);
 
    if(index >= 2)
        meshBuilder.UsePrimitive(material1).AddTriangle(v0, v1, v2);
    else
        meshBuilder.UsePrimitive(material).AddTriangle(v0, v1, v2);
 
    index++;
 
}
var scene = new SceneBuilder();
scene.AddRigidMesh(meshBuilder, Matrix4x4.Identity);
 
scene.ToGltf2().SaveGLTF("output.gltf");

По итогу, создаются обе модели и одна модель просто "сидит" в первой, как я понимаю, либо clipper не правильно вырезает, либо на каком-то этапе еще допущена ошибка.

Квадрат..


Ответы (0 шт):