我的代码有什么问题:"clipping polygon(ellipse points) with line segments(subject) with clipper library in c#"
Anything wrong with my code:"clipping polygon(ellipse points) with line segments(subject) with clipper library in c#"
1.I正在 PictureBox 上绘制椭圆和线条。
2.I在执行 clipper.PolyTreeToPaths(polytree_solution);
see the contents
后,路径对象计数为零
3.PolyTree
对象包含此 see the contents.
我知道我的问题与这些链接类似,但我找不到问题的解决方案,可能是我找不到代码中的错误。
link1
link2
link3
//adding subject (lines)
Paths subj=new Paths(1);
subj.Add(new Path());
subj[0].Add(new IntPoint(0,0));
subj[0].Add(new IntPoint(440,280));
subj[0].Add(new IntPoint(440,0));
subj[0].Add(new IntPoint(0,280));
subj[0].Add(new IntPoint(440/2,280));
subj[0].Add(new IntPoint(440/2,0));
//for clip, GraphicsPath object is defined properly by ellipse points by help of mouse events
GraphicsPath path=new GraphicsPath();
path.AddEllipse(m_rectArena);
Paths clip=new Paths(1);
int scale=100;
path.Flatten();
Path clip2=new Path(path.PointCount);
foreach(PointF p in path.PathPoints)
{
clip2.Add(new IntPoint((int)(p.X*scale),(int)(p.Y*scale)));
}
clip.Add(clip2);
Paths solution=new Paths();
PolyTree polytree_solution=new PolyTree();
Clipper c=new Clipper();
c.AddPath(subj[0],PolyTree.ptSubject,false);
c.AddPaths(clip,PolyType.ptClip,true);
c.Execute(ClipType.ctIntersection,polytree_solution,PolyFilllType.pftEvenOdd,PolyFillType.pftEvenOdd);
Paths openp=Clipper.PolyTreeToPaths(polytree_solution);
1.I 想要 ct.Intersection
线条(主题)和圆圈(剪辑),但那没有发生 pic click here 。
2.Actual 在 PictureBox 上绘图 click here
如果您不提供代码的关键元素(特别是我们没有 m_rectArena 坐标的指示),则很难确定您的错误在哪里。
无论如何,这是我从您提供的信息中拼凑出来的(带有您所附图片中看到的椭圆的近似值):
Paths subj = new Paths(1);
subj.Add(new Path());
subj[0].Add(new IntPoint(0, 0));
subj[0].Add(new IntPoint(440, 280));
subj[0].Add(new IntPoint(440, 0));
subj[0].Add(new IntPoint(0, 280));
subj[0].Add(new IntPoint(440 / 2, 280));
subj[0].Add(new IntPoint(440 / 2, 0));
GraphicsPath gpEllipse = new GraphicsPath();
Rectangle r = new Rectangle(40,40,360,360);
gpEllipse.AddEllipse(r);
gpEllipse.Flatten();
Paths clip = new Paths(1);
clip.Add(new Path());
foreach (PointF p in gpEllipse.PathPoints)
clip[0].Add(new IntPoint(p.X, p.Y));
Clipper c = new Clipper();
c.AddPaths(subj, PolyType.ptSubject, false);
c.AddPaths(clip, PolyType.ptClip, true);
Paths solution = new Paths();
PolyTree solutiontree = new PolyTree();
c.Execute(ClipType.ctIntersection, solutiontree,
PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
solution = Clipper.OpenPathsFromPolyTree(solutiontree);
//nb: you'll find SVGBuilder in SVG.cs in the sample code accompanying Clipper
SVGBuilder svg = new SVGBuilder();
svg.AddPaths(subj, Color.White, Color.Black, false);
svg.AddPaths(clip, Color.FromArgb(0x18, 0xFF, 0xFF, 0), Color.Black, true);
svg.PenWidth = 2.5;
svg.AddPaths(solution, Color.White, Color.Red, false);
svg.SaveToFile("c:\temp\test.svg", 640, 480, 20);
结果如下:
1.I正在 PictureBox 上绘制椭圆和线条。
2.I在执行 clipper.PolyTreeToPaths(polytree_solution);
see the contents
后,路径对象计数为零
3.PolyTree
对象包含此 see the contents.
我知道我的问题与这些链接类似,但我找不到问题的解决方案,可能是我找不到代码中的错误。 link1 link2 link3
//adding subject (lines)
Paths subj=new Paths(1);
subj.Add(new Path());
subj[0].Add(new IntPoint(0,0));
subj[0].Add(new IntPoint(440,280));
subj[0].Add(new IntPoint(440,0));
subj[0].Add(new IntPoint(0,280));
subj[0].Add(new IntPoint(440/2,280));
subj[0].Add(new IntPoint(440/2,0));
//for clip, GraphicsPath object is defined properly by ellipse points by help of mouse events
GraphicsPath path=new GraphicsPath();
path.AddEllipse(m_rectArena);
Paths clip=new Paths(1);
int scale=100;
path.Flatten();
Path clip2=new Path(path.PointCount);
foreach(PointF p in path.PathPoints)
{
clip2.Add(new IntPoint((int)(p.X*scale),(int)(p.Y*scale)));
}
clip.Add(clip2);
Paths solution=new Paths();
PolyTree polytree_solution=new PolyTree();
Clipper c=new Clipper();
c.AddPath(subj[0],PolyTree.ptSubject,false);
c.AddPaths(clip,PolyType.ptClip,true);
c.Execute(ClipType.ctIntersection,polytree_solution,PolyFilllType.pftEvenOdd,PolyFillType.pftEvenOdd);
Paths openp=Clipper.PolyTreeToPaths(polytree_solution);
1.I 想要 ct.Intersection
线条(主题)和圆圈(剪辑),但那没有发生 pic click here 。
2.Actual 在 PictureBox 上绘图 click here
如果您不提供代码的关键元素(特别是我们没有 m_rectArena 坐标的指示),则很难确定您的错误在哪里。
无论如何,这是我从您提供的信息中拼凑出来的(带有您所附图片中看到的椭圆的近似值):
Paths subj = new Paths(1);
subj.Add(new Path());
subj[0].Add(new IntPoint(0, 0));
subj[0].Add(new IntPoint(440, 280));
subj[0].Add(new IntPoint(440, 0));
subj[0].Add(new IntPoint(0, 280));
subj[0].Add(new IntPoint(440 / 2, 280));
subj[0].Add(new IntPoint(440 / 2, 0));
GraphicsPath gpEllipse = new GraphicsPath();
Rectangle r = new Rectangle(40,40,360,360);
gpEllipse.AddEllipse(r);
gpEllipse.Flatten();
Paths clip = new Paths(1);
clip.Add(new Path());
foreach (PointF p in gpEllipse.PathPoints)
clip[0].Add(new IntPoint(p.X, p.Y));
Clipper c = new Clipper();
c.AddPaths(subj, PolyType.ptSubject, false);
c.AddPaths(clip, PolyType.ptClip, true);
Paths solution = new Paths();
PolyTree solutiontree = new PolyTree();
c.Execute(ClipType.ctIntersection, solutiontree,
PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
solution = Clipper.OpenPathsFromPolyTree(solutiontree);
//nb: you'll find SVGBuilder in SVG.cs in the sample code accompanying Clipper
SVGBuilder svg = new SVGBuilder();
svg.AddPaths(subj, Color.White, Color.Black, false);
svg.AddPaths(clip, Color.FromArgb(0x18, 0xFF, 0xFF, 0), Color.Black, true);
svg.PenWidth = 2.5;
svg.AddPaths(solution, Color.White, Color.Red, false);
svg.SaveToFile("c:\temp\test.svg", 640, 480, 20);
结果如下: