示例#1
0
    private void RemoveCircle(Vector2 center, float radius, int count = 40)
    {
        List <IntPoint> poly = new List <IntPoint>();

        float delta = Mathf.PI * 2 / count;

        for (int i = 0; i < count; i++)
        {
            float x = center.x + Mathf.Cos(delta * i) * radius;
            float y = center.y + Mathf.Sin(delta * i) * radius;
            poly.Add(Convert(x, y));
        }

        Clipper clipper = new Clipper(Clipper.ioStrictlySimple);

        clipper.AddPolygons(m_polys, PolyType.ptSubject);
        clipper.AddPolygon(poly, PolyType.ptClip);
        clipper.Execute(ClipType.ctDifference, m_polyTree);

        Clipper.PolyTreeToPolygons(m_polyTree, m_polys);
        Clipper.SimplifyPolygons(m_polys);

        List <DelaunayTriangle> triangles = GenerateTriangles();

        GenerateMesh(triangles);
    }
示例#2
0
        //---------------------------------------------------------------------------

        private void DrawBitmap(bool justClip = false)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                if (!justClip)
                {
                    if (rbTest2.Checked)
                    {
                        GenerateAustPlusRandomEllipses((int)nudCount.Value);
                    }
                    else
                    {
                        GenerateRandomPolygon((int)nudCount.Value);
                    }
                }
                using (Graphics newgraphic = Graphics.FromImage(mybitmap))
                    using (GraphicsPath path = new GraphicsPath())
                    {
                        newgraphic.SmoothingMode = SmoothingMode.AntiAlias;
                        newgraphic.Clear(Color.White);
                        if (rbNonZero.Checked)
                        {
                            path.FillMode = FillMode.Winding;
                        }

                        //draw subjects ...
                        foreach (Polygon pg in subjects)
                        {
                            PointF[] pts = PolygonToPointFArray(pg, scale);
                            path.AddPolygon(pts);
                            pts = null;
                        }
                        using (Pen myPen = new Pen(Color.FromArgb(196, 0xC3, 0xC9, 0xCF), (float)0.6))
                            using (SolidBrush myBrush = new SolidBrush(Color.FromArgb(127, 0xDD, 0xDD, 0xF0)))
                            {
                                newgraphic.FillPath(myBrush, path);
                                newgraphic.DrawPath(myPen, path);
                                path.Reset();

                                //draw clips ...
                                if (rbNonZero.Checked)
                                {
                                    path.FillMode = FillMode.Winding;
                                }
                                foreach (Polygon pg in clips)
                                {
                                    PointF[] pts = PolygonToPointFArray(pg, scale);
                                    path.AddPolygon(pts);
                                    pts = null;
                                }
                                myPen.Color   = Color.FromArgb(196, 0xF9, 0xBE, 0xA6);
                                myBrush.Color = Color.FromArgb(127, 0xFF, 0xE0, 0xE0);
                                newgraphic.FillPath(myBrush, path);
                                newgraphic.DrawPath(myPen, path);

                                //do the clipping ...
                                if ((clips.Count > 0 || subjects.Count > 0) && !rbNone.Checked)
                                {
                                    Polygons solution2 = new Polygons();
                                    Clipper  c         = new Clipper();
                                    c.AddPaths(subjects, PolyType.ptSubject, true);
                                    c.AddPaths(clips, PolyType.ptClip, true);
                                    solution.Clear();
#if UsePolyTree
                                    bool succeeded = c.Execute(GetClipType(), solutionTree, GetPolyFillType(), GetPolyFillType());
                                    //nb: we aren't doing anything useful here with solutionTree except to show
                                    //that it works. Convert PolyTree back to Polygons structure ...
                                    Clipper.PolyTreeToPolygons(solutionTree, solution);
#else
                                    bool succeeded = c.Execute(GetClipType(), solution, GetPolyFillType(), GetPolyFillType());
#endif
                                    if (succeeded)
                                    {
                                        //SaveToFile("solution", solution);
                                        myBrush.Color = Color.Black;
                                        path.Reset();

                                        //It really shouldn't matter what FillMode is used for solution
                                        //polygons because none of the solution polygons overlap.
                                        //However, FillMode.Winding will show any orientation errors where
                                        //holes will be stroked (outlined) correctly but filled incorrectly  ...
                                        path.FillMode = FillMode.Winding;

                                        //or for something fancy ...

                                        if (nudOffset.Value != 0)
                                        {
                                            ClipperOffset co = new ClipperOffset();
                                            co.AddPaths(solution, JoinType.jtRound, EndType.etClosedPolygon);
                                            co.Execute(ref solution2, (double)nudOffset.Value * scale);
                                        }
                                        else
                                        {
                                            solution2 = new Polygons(solution);
                                        }

                                        foreach (Polygon pg in solution2)
                                        {
                                            PointF[] pts = PolygonToPointFArray(pg, scale);
                                            if (pts.Count() > 2)
                                            {
                                                path.AddPolygon(pts);
                                            }
                                            pts = null;
                                        }
                                        myBrush.Color = Color.FromArgb(127, 0x66, 0xEF, 0x7F);
                                        myPen.Color   = Color.FromArgb(255, 0, 0x33, 0);
                                        myPen.Width   = 1.0f;
                                        newgraphic.FillPath(myBrush, path);
                                        newgraphic.DrawPath(myPen, path);

                                        //now do some fancy testing ...
                                        using (Font f = new Font("Arial", 8))
                                            using (SolidBrush b = new SolidBrush(Color.Navy))
                                            {
                                                double subj_area = 0, clip_area = 0, int_area = 0, union_area = 0;
                                                c.Clear();
                                                c.AddPaths(subjects, PolyType.ptSubject, true);
                                                c.Execute(ClipType.ctUnion, solution2, GetPolyFillType(), GetPolyFillType());
                                                foreach (Polygon pg in solution2)
                                                {
                                                    subj_area += Clipper.Area(pg);
                                                }
                                                c.Clear();
                                                c.AddPaths(clips, PolyType.ptClip, true);
                                                c.Execute(ClipType.ctUnion, solution2, GetPolyFillType(), GetPolyFillType());
                                                foreach (Polygon pg in solution2)
                                                {
                                                    clip_area += Clipper.Area(pg);
                                                }
                                                c.AddPaths(subjects, PolyType.ptSubject, true);
                                                c.Execute(ClipType.ctIntersection, solution2, GetPolyFillType(), GetPolyFillType());
                                                foreach (Polygon pg in solution2)
                                                {
                                                    int_area += Clipper.Area(pg);
                                                }
                                                c.Execute(ClipType.ctUnion, solution2, GetPolyFillType(), GetPolyFillType());
                                                foreach (Polygon pg in solution2)
                                                {
                                                    union_area += Clipper.Area(pg);
                                                }


                                                using (StringFormat lftStringFormat = new StringFormat())
                                                    using (StringFormat rtStringFormat = new StringFormat())
                                                    {
                                                        lftStringFormat.Alignment     = StringAlignment.Near;
                                                        lftStringFormat.LineAlignment = StringAlignment.Near;
                                                        rtStringFormat.Alignment      = StringAlignment.Far;
                                                        rtStringFormat.LineAlignment  = StringAlignment.Near;
                                                        Rectangle rec = new Rectangle(pictureBox1.ClientSize.Width - 108,
                                                                                      pictureBox1.ClientSize.Height - 116, 104, 106);
                                                        newgraphic.FillRectangle(new SolidBrush(Color.FromArgb(196, Color.WhiteSmoke)), rec);
                                                        newgraphic.DrawRectangle(myPen, rec);
                                                        rec.Inflate(new Size(-2, 0));
                                                        newgraphic.DrawString("Areas", f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 14));
                                                        newgraphic.DrawString("subj: ", f, b, rec, lftStringFormat);
                                                        newgraphic.DrawString((subj_area / 100000).ToString("0,0"), f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 12));
                                                        newgraphic.DrawString("clip: ", f, b, rec, lftStringFormat);
                                                        newgraphic.DrawString((clip_area / 100000).ToString("0,0"), f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 12));
                                                        newgraphic.DrawString("intersect: ", f, b, rec, lftStringFormat);
                                                        newgraphic.DrawString((int_area / 100000).ToString("0,0"), f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 12));
                                                        newgraphic.DrawString("---------", f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 10));
                                                        newgraphic.DrawString("s + c - i: ", f, b, rec, lftStringFormat);
                                                        newgraphic.DrawString(((subj_area + clip_area - int_area) / 100000).ToString("0,0"), f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 10));
                                                        newgraphic.DrawString("---------", f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 10));
                                                        newgraphic.DrawString("union: ", f, b, rec, lftStringFormat);
                                                        newgraphic.DrawString((union_area / 100000).ToString("0,0"), f, b, rec, rtStringFormat);
                                                        rec.Offset(new Point(0, 10));
                                                        newgraphic.DrawString("---------", f, b, rec, rtStringFormat);
                                                    }
                                            }
                                    } //end if succeeded
                                }     //end if something to clip
                                pictureBox1.Image = mybitmap;
                            }
                    }
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }