C#使用裁剪器库剪裁线段
我正在使用clipper对表示程序中对象轮廓的多边形执行一系列操作。问题是,我现在想剪裁一个线段网格来填充这些轮廓,但我正努力使用Clipper来完成这一点 目前,我正在将我的直线转换为厚度为2个单位的矩形,然后对其执行相交操作,最后我需要将新多边形恢复为线段。但这是非常低效的,并且会产生很多错误C#使用裁剪器库剪裁线段,c#,polygons,clipperlib,C#,Polygons,Clipperlib,我正在使用clipper对表示程序中对象轮廓的多边形执行一系列操作。问题是,我现在想剪裁一个线段网格来填充这些轮廓,但我正努力使用Clipper来完成这一点 目前,我正在将我的直线转换为厚度为2个单位的矩形,然后对其执行相交操作,最后我需要将新多边形恢复为线段。但这是非常低效的,并且会产生很多错误 这可以通过Clipper实现吗?如果没有,我是否可以使用其他工具,或者我是否需要实现自己的线段裁剪器?使用Clipper ver 6 using ClipperLib; using Path = L
这可以通过Clipper实现吗?如果没有,我是否可以使用其他工具,或者我是否需要实现自己的线段裁剪器?使用Clipper ver 6
using ClipperLib;
using Path = List<IntPoint>;
using Paths = List<List<IntPoint>>;
static Polygon IntsToPolygon(Int64[] ints)
{
int len1 = ints.Length / 2;
Polygon result = new Polygon(len1);
for (int i = 0; i < len1; i++)
result.Add(new IntPoint(ints[i * 2], ints[i * 2 + 1]));
return result;
}
static void Main(string[] args)
{
Paths clip = new Paths(); //clipping polygon(s)
//make a polygon in the shape of a pentagram
//with center (200,200) and radius 100 ...
Int64[][] ints1 = new Int64[][]
{
new Int64[]{222, 169, 295, 169, 236, 212, 259, 281, 200, 238,
141, 281, 164, 212, 105, 169, 178, 169, 200, 100}
};
clip.Add(IntsToPolygon(ints1[0]));
Paths subj = new Paths(); //subject paths, could be open or closed here
int gridWidth = 5;
int loopCnt = 200 / gridWidth;
//now make grid lines and add them to subj ready for clipping ...
//add horizontal grid lines ...
for (int i = 0; i <= loopCnt; i++)
{
Path gridLine = new Path(2);
gridLine.Add(new IntPoint(100, 100 + i * gridWidth));
gridLine.Add(new IntPoint(300, 100 + i * gridWidth));
subj.Add(gridLine);
}
//add vertical grid lines ...
for (int i = 0; i <= loopCnt; i++)
{
Path gridLine = new Path(2);
gridLine.Add(new IntPoint(100 + i * gridWidth, 100));
gridLine.Add(new IntPoint(100 + i * gridWidth, 300));
subj.Add(gridLine);
}
//now clip the gridlines (subj) with the pentagram (clip) ...
Clipper c = new Clipper();
PolyTree solution = new PolyTree();
c.AddPaths(subj, PolyType.ptSubject, false); //ie paths NOT closed
c.AddPaths(clip, PolyType.ptClip, true); //nb: clip paths MUST be closed
c.Execute(ClipType.ctIntersection,
solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
Paths clippedGrids = Clipper.PolyTreeToPaths(solution);
//Display the result (sorry, make your own display function) ...
//Display(Paths p, Color stroke, Color brush, PolyFillType pft, bool IsClosed)
Display(subj, Color.FromArgb(0x18, 0, 0, 0x9c),
Color.Blue, PolyFillType.NonZero, false); //unclipped grid
Display(clippedGrids, FromArgb(0, 0, 0, 0),
Color.Red, false); //clipped grid
}
使用ClipperLib;
使用路径=列表;
使用路径=列表;
静态多边形IntsToPolygon(Int64[]ints)
{
整数长度1=整数长度/2;
多边形结果=新多边形(len1);
对于(int i=0;i