/// <summary>
        /// Exports a string representation of polygons.
        /// Can be uses to import it again.
        /// </summary>
        /// <returns>A multi-line string of a polypolygon points definitions.</returns>
        public String ToExportString()
        {
            List <List <PolyPointDescriptor> > polys = CachedPolyPointList;
            String exp = PolygonHelper.BuildExportString(polys);

            return(exp);
        }
 /// <summary>
 /// Updates this instance and his related Objects. Especially the cached poly polygon points
 /// </summary>
 virtual public void Update()
 {
     if (_updating)
     {
         return;
     }
     try
     {
         _updating = true;
         if (IsValid())
         {
             OoShapeObserver.LockValidation = true;
             try
             {
                 CachedPolyPointList = PolygonHelper.GetPolyPoints(Shape.Shape);
                 IsClosed(false);
                 IsBezier(false);
             }
             finally
             {
                 OoShapeObserver.LockValidation = false;
                 _updating = false;
             }
         }
         else
         {
             CachedPolyPointList = null;
         }
     }
     finally
     {
         _updating = false;
     }
 }
Example #3
0
        private void button9_Click(object sender, EventArgs e)
        {
            if (!(dataModel.SelectedItem is PolygonHelper ph2))
            {
                return;
            }

            var           hull = DeepNest.getHull(ph2.TransformedNfp());
            PolygonHelper ph   = new PolygonHelper();

            ph.Polygon = hull;
            var           box = ph.BoundingBox().Value;
            PolygonHelper ph3 = new PolygonHelper();

            ph3.Polygon = new NFP()
            {
                Points = new SvgPoint[] {
                    new SvgPoint(box.Left, box.Top),
                    new SvgPoint(box.Left, box.Bottom),
                    new SvgPoint(box.Right, box.Bottom),
                    new SvgPoint(box.Right, box.Top),
                }
            };

            ph3.Name = "AABB";
            dataModel.AddItem(ph3);
        }
Example #4
0
        private void button10_Click(object sender, EventArgs e)
        {
            if (!(dataModel.SelectedItem is PolygonHelper ph2))
            {
                return;
            }

            var hull = DeepNest.getHull(new NFP()
            {
                Points = ph2.TransformedPoints().ToArray()
            });
            PolygonHelper ph = new PolygonHelper();

            ph.Polygon = hull;

            var           mar = GeometryUtil.GetMinimumBox(hull.Points.Select(z => new Vector2d(z.X, z.Y)).ToArray());
            PolygonHelper ph3 = new PolygonHelper();

            ph3.Polygon = new NFP()
            {
                Points = mar.Select(z => new SvgPoint(z.X, z.Y)).ToArray()
            };

            ph3.Name = "minRect";
            dataModel.AddItem(ph3);
        }
        private void button6_Click(object sender, EventArgs e)
        {
            List <PolygonHelper> ar1 = new List <PolygonHelper>();

            for (int i = 0; i < dataModel.SelectedItems.Length; i++)
            {
                ar1.Add(dataModel.SelectedItems[i] as PolygonHelper);
            }

            if (ar1.Count != 2)
            {
                dataModel.ParentForm.StatusMessage("there are no 2 polygon selected", StatusMessageType.Warning); return;
            }

            PolyBool pb = new PolyBool();

            //var poly1 = GetPolygon(ar1[0].TransformedPoints().ToArray());
            //var poly2 = GetPolygon(ar1[1].TransformedPoints().ToArray());
            var poly1 = ar1[0].GetPolygon();
            var poly2 = ar1[1].GetPolygon();
            var r     = pb.intersect(poly1, poly2);

            if (r.regions.Count == 0)
            {
                dataModel.ParentForm.StatusMessage("no intersections", StatusMessageType.Warning);
                return;
            }
            var           pnts = r.regions.ToArray()[0].ToArray();
            PolygonHelper ph   = new PolygonHelper();

            ph.Polygon.Points = pnts.Select(z => new SvgPoint(z.x, z.y)).ToArray();
            dataModel.AddItem(ph);
        }
Example #6
0
        public void AreaOk3()
        {
            // a complicated snake
            var points = new Point[]
            {
                new Point(-2, 3),
                new Point(-5, 0),
                new Point(-5.62, -4.69),
                new Point(-2.86, -6.99),
                new Point(1.94, -7.27),
                new Point(4.38, -4.21),
                new Point(5.44, -0.15),
                new Point(3.52, -2.17),
                new Point(2.64, -4.23),
                new Point(0.36, -5.47),
                new Point(-2.76, -4.73),
                new Point(-3.42, -3.19),
                new Point(-3.44, -0.83),
                new Point(-0.06, -2.25),
                new Point(-1.64, -3.53),
                new Point(-2.28, -2.11),
                new Point(-2.1, -4.31),
                new Point(0.44, -3.67),
                new Point(0.92, -0.21),
                new Point(-2.08, 0.51)
            };
            var etalon = 45.83;

            var(a, e) = PolygonHelper.Area(points);

            Console.WriteLine($"Error:{e.ToString()}\r\nAnswer:{a.ToString(PrecisionPoly)}\r\nEtalon:{etalon.ToString(PrecisionPoly)}");

            Assert.AreEqual(Errors.None, e);
            Assert.AreEqual(etalon.ToString(PrecisionPoly), a.ToString(PrecisionPoly));
        }
 /// <summary>
 /// Determines whether this Freeform is a closed one or an open one.
 /// </summary>
 /// <param name="cached">if set to <c>true</c> the previously cached result will be returned.</param>
 /// <returns>
 ///   <c>true</c> if the Freeform is a closed one; otherwise, <c>false</c>.
 /// </returns>
 virtual public bool IsClosed(bool cached = true)
 {
     if (IsValid() && !cached)
     {
         _isClosed = PolygonHelper.IsClosedFreeForm(Shape.Shape);
     }
     return(_isClosed);
 }
 /// <summary>
 /// Gets the polygon points.
 /// </summary>
 /// <returns>a warper for helping handling polygon points or <c>null</c> if this is not a shape that have polygon points.</returns>
 virtual public OoPolygonPointsObserver GetPolygonPointsObserver()
 {
     if (_ppObs == null && PolygonHelper.IsFreeform(Shape))
     {
         _ppObs = new OoPolygonPointsObserver(this);
     }
     return(_ppObs);
 }
Example #9
0
        private void dxfFromFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "dxf files (*.dxf)|*.dxf";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            var r = DxfParser.LoadDxf(ofd.FileName);

            List <NFP> nfps = new List <NFP>();

            foreach (var rr in r)
            {
                nfps.Add(new NFP()
                {
                    Points = rr.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray()
                });
            }

            for (int i = 0; i < nfps.Count; i++)
            {
                for (int j = 0; j < nfps.Count; j++)
                {
                    if (i != j)
                    {
                        var d2 = nfps[i];
                        var d3 = nfps[j];
                        var f0 = d3.Points[0];
                        if (StaticHelpers.pnpoly(d2.Points.ToArray(), f0.X, f0.Y))
                        {
                            d3.Parent = d2;
                            if (!d2.Childrens.Contains(d3))
                            {
                                d2.Childrens.Add(d3);
                            }
                        }
                    }
                }
            }

            List <HelperItem> ret = new List <HelperItem>();

            foreach (var item in nfps)
            {
                if (item.Parent != null)
                {
                    continue;
                }
                PolygonHelper phh = new PolygonHelper();
                phh.Name = new FileInfo(ofd.FileName).Name;
                ret.Add(phh);
                phh.Polygon = item;
            }

            dataModel.AddItems(ret.ToArray());
        }
Example #10
0
        private void button8_Click(object sender, EventArgs e)
        {
            List <PolygonHelper> phhs = new List <PolygonHelper>();

            //if (!checkBox1.Checked)
            {
                if (dataModel.SelectedItems.Length < 2)
                {
                    dataModel.ParentForm.StatusMessage("there are no 2 polygon selected", StatusMessageType.Warning); return;
                }

                foreach (var item in dataModel.SelectedItems)
                {
                    phhs.Add(item as PolygonHelper);
                }
            }
            //  else
            {
                //   phhs.Add((comboBox2.SelectedItem as ComboBoxItem).Tag as PolygonHelper);
                //   phhs.Add((comboBox3.SelectedItem as ComboBoxItem).Tag as PolygonHelper);
            }

            var ar1 = phhs.ToArray();


            NFP p  = new NFP();
            NFP p2 = new NFP();


            var    jType          = (JoinType)comboBox1.SelectedIndex;
            double offset         = double.Parse(textBox2.Text.Replace(",", "."), CultureInfo.InvariantCulture);
            double miterLimit     = double.Parse(textBox3.Text.Replace(",", "."), CultureInfo.InvariantCulture);
            double curveTolerance = double.Parse(textBox4.Text.Replace(",", "."), CultureInfo.InvariantCulture);

            p.Points  = ar1[0].Polygon.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
            p2.Points = ar1[1].Polygon.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
            var           offs = ClipperHelper.intersection(p, p2, offset, jType, curveTolerance: curveTolerance, miterLimit: miterLimit);
            PolygonHelper ph   = new PolygonHelper();


            if (offs.Any())
            {
                ph.Polygon.Points = offs.First().Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
            }

            foreach (var item in offs.Skip(1))
            {
                var nfp2 = new NFP();

                nfp2.Points = item.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
                ph.Polygon.Childrens.Add(nfp2);
            }


            dataModel.AddItem(ph);
        }
Example #11
0
 /**
  * Returns whether a point is inside the exit
  *
  * @param x
  *            the horizontal positon
  * @param y
  *            the vertical position
  * @return true if the point (x, y) is inside the exit, false otherwise
  */
 public bool isPointInside(int x, int y)
 {
     if (rectangular)
     {
         return(x > getX0() && x < getX1() && y > getY0() && y < getY1());
     }
     else
     {
         return(PolygonHelper.ContainsPoint(getPoints(), new Vector2(x, y)));
     }
 }
Example #12
0
        private void polygonToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var ph = new PolygonHelper()
            {
            };

            Helpers.Add(ph);
            ph.Verticies.Add(new Vector3d(0, 0, 0));
            ph.Verticies.Add(new Vector3d(6, 2, 0));
            ph.Verticies.Add(new Vector3d(6, 6, 0));
            ph.Verticies.Add(new Vector3d(0, 8, 0));
            updateHelpersList();
        }
Example #13
0
        private void button1_Click(object sender, EventArgs e)
        {
            NFP p = new NFP();

            if (!(dataModel.SelectedItem is PolygonHelper ph2))
            {
                return;
            }

            p.Points = ph2.Polygon.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
            var    jType          = (JoinType)comboBox1.SelectedIndex;
            double offset         = double.Parse(textBox2.Text.Replace(",", "."), CultureInfo.InvariantCulture);
            double miterLimit     = double.Parse(textBox3.Text.Replace(",", "."), CultureInfo.InvariantCulture);
            double curveTolerance = double.Parse(textBox4.Text.Replace(",", "."), CultureInfo.InvariantCulture);
            var    offs           = ClipperHelper.offset(p, offset, jType, curveTolerance: curveTolerance, miterLimit: miterLimit);
            //if (offs.Count() > 1) throw new NotImplementedException();
            PolygonHelper ph = new PolygonHelper();

            foreach (var item in ph2.Polygon.Childrens)
            {
                var offs2 = ClipperHelper.offset(item, -offset, jType, curveTolerance: curveTolerance, miterLimit: miterLimit);
                var nfp1  = new NFP();
                if (offs2.Any())
                {
                    //if (offs2.Count() > 1) throw new NotImplementedException();
                    foreach (var zitem in offs2)
                    {
                        nfp1.Points = zitem.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
                        ph.Polygon.Childrens.Add(nfp1);
                    }
                }
            }

            if (offs.Any())
            {
                ph.Polygon.Points = offs.First().Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
            }

            foreach (var item in offs.Skip(1))
            {
                var nfp2 = new NFP();

                nfp2.Points = item.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
                ph.Polygon.Childrens.Add(nfp2);
            }

            ph.OffsetX  = ph2.OffsetX;
            ph.OffsetY  = ph2.OffsetY;
            ph.Rotation = ph2.Rotation;
            dataModel.AddItem(ph);
        }
Example #14
0
    private float CalculateTriangles(SerializedProperty originProp, SerializedProperty vertexesProp,
                                     SerializedProperty trianglesProp, SerializedProperty triangleAreasProp)
    {
        Vector3[] vertexes = new Vector3[vertexesProp.arraySize];
        float     area     = 0;

        for (int i = 0; i < vertexesProp.arraySize; ++i)
        {
            vertexes[i] = vertexesProp.GetArrayElementAtIndex(i).vector3Value;
        }

        originProp.vector3Value = PolygonAreaExtend.GetCentroid(vertexes.ToList());

        Undo.RecordObject(((MonoBehaviour)target).gameObject, "Position");
        ((MonoBehaviour)target).transform.position = originProp.vector3Value;

        PolygonHelper.Triangulate(vertexes, -GetPlane(originProp.vector3Value).normal, out var triangles);

        if (triangles.Count != trianglesProp.arraySize)
        {
            trianglesProp.ClearArray();
            for (int i = 0; i < triangles.Count; ++i)
            {
                trianglesProp.InsertArrayElementAtIndex(i);
            }
        }

        if (triangles.Count != triangleAreasProp.arraySize)
        {
            triangleAreasProp.ClearArray();
            for (int i = 0; i < triangles.Count; ++i)
            {
                triangleAreasProp.InsertArrayElementAtIndex(i);
            }
        }

        for (int i = 0; i < triangles.Count; ++i)
        {
            var prop = trianglesProp.GetArrayElementAtIndex(i);
            var tri  = triangles[i];
            prop.FindPropertyRelative("x").vector3Value = tri.x;
            prop.FindPropertyRelative("y").vector3Value = tri.y;
            prop.FindPropertyRelative("z").vector3Value = tri.z;

            var areaProp = triangleAreasProp.GetArrayElementAtIndex(i);
            areaProp.floatValue = tri.CalcTriangleArea();
            area += areaProp.floatValue;
        }

        return(area);
    }
Example #15
0
        public void AreaFail1()
        {
            var points = new Point[]
            {
                new Point(-5.26, 3.37),
                new Point(-1.26, 0),
            };


            var(a, e) = PolygonHelper.Area(points);

            Console.WriteLine($"Error:{e.ToString()}\r\nAnswer:{a.ToString(PrecisionPoly)}");

            Assert.AreEqual(Errors.NeedMorePoints, e);
            Assert.AreEqual((-1).ToString(PrecisionPoly), a.ToString(PrecisionPoly));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="OoPolygonPointsObserver" /> class.
        /// </summary>
        /// <param name="shape">The corresponding shape.</param>
        /// <exception cref="ArgumentNullException">shape</exception>
        /// <exception cref="ArgumentException">shape must be a polygon or a bezier curve;shape</exception>
        public OoPolygonPointsObserver(OoShapeObserver shape)
        {
            if (shape == null)
            {
                throw new ArgumentNullException("shape");
            }
            if (!PolygonHelper.IsFreeform(shape.Shape))
            {
                throw new ArgumentException("shape must be a polygon or a bezier curve", "shape");
            }

            Shape = shape;
            Shape.BoundRectChangeEventHandlers += Shape_BoundRectChangeEventHandlers;
            Shape.ObserverDisposing            += Shape_ObserverDisposing;
            Update();
            IsEmpty = false;
        }
Example #17
0
        bool lineIntersecOutline(Line line, List <XYZ> outline)
        {
            var points = outline.Select(m => m.ProjectToXLine(line));

            points = points.Where(m => m.IsOnLine(line));
            foreach (var point in points)
            {
                var newpoint  = new XYZ(point.X, point.Y, outline.First().Z);
                var inpolygon = PolygonHelper.IsPointInRegion(newpoint, outline, XYZ.BasisZ);
                if (inpolygon)
                {
                    return(true);
                }
            }

            return(false);
        }
Example #18
0
        public static PolyBoolCS.Polygon GetPolygon(this  PolygonHelper ph)
        {
            var p = new PolyBoolCS.Polygon();

            p.regions = new List <PointList>();
            var       pnts  = ph.Polygon.Points.Select(z => ph.Transform(z)).ToArray();
            PointList plist = GetPointList(pnts);

            p.regions.Add(plist);
            foreach (var item in ph.Polygon.Childrens)
            {
                pnts  = item.Points.Select(z => ph.Transform(z)).ToArray();
                plist = GetPointList(pnts);
                p.regions.Add(plist);
            }
            return(p);
        }
Example #19
0
        public void AreaOk4()
        {
            var points = new Point[]
            {
                new Point(-5.26, 3.37),
                new Point(-5.26, double.PositiveInfinity),
                new Point(-5.26, 3.37),
            };
            var etalon = double.NaN;

            var(a, e) = PolygonHelper.Area(points);

            Console.WriteLine($"Error:{e.ToString()}\r\nAnswer:{a.ToString(PrecisionPoly)}\r\nEtalon:{etalon.ToString(PrecisionPoly)}");

            Assert.AreEqual(Errors.None, e);
            Assert.AreEqual(etalon.ToString(PrecisionPoly), a.ToString(PrecisionPoly));
        }
Example #20
0
        private void button4_Click(object sender, EventArgs e)
        {
            if (!(dataModel.SelectedItem is PolygonHelper ph2))
            {
                return;
            }

            var hull = DeepNest.getHull(new NFP()
            {
                Points = ph2.TransformedPoints()
            });
            PolygonHelper ph = new PolygonHelper();

            ph.Polygon = hull;
            ph.Name    = "hull";
            dataModel.AddItem(ph);
        }
 /// <summary>
 /// Writes the points to polygons properties.
 /// </summary>
 /// <param name="geometry">if set to <c>true</c> the 'Geometry' property is used (these are the untransformed coordinates of the polygon).
 /// <returns><c>true</c> if the points could be written to the properties</returns>
 virtual public bool WritePointsToPolygon(bool geometry = false)
 {
     if (IsValid())
     {
         OoShapeObserver.LockValidation = true;
         try
         {
             bool success = PolygonHelper.SetPolyPoints(Shape.Shape, CachedPolyPointList, geometry, Shape.GetDocument());
             Update();
             return(success);
         }
         finally
         {
             OoShapeObserver.LockValidation = false;
         }
     }
     return(false);
 }
 /// <summary>
 /// Sets the poly point list.
 /// </summary>
 /// <param name="newPoints">The new points.</param>
 /// <param name="geometry">if set to <c>true</c> the 'Geometry' property is used (these are the untransformed coordinates of the polygon).
 /// <returns><c>true</c> if the points could be written to the properties</returns>
 virtual public bool SetPolyPointList(List <List <PolyPointDescriptor> > newPoints, bool geometry = false)
 {
     if (IsValid())
     {
         OoShapeObserver.LockValidation = true;
         try
         {
             bool success = PolygonHelper.SetPolyPoints(Shape.Shape, newPoints, geometry, Shape.GetDocument());
             Update();
             return(success);
         }
         finally
         {
             OoShapeObserver.LockValidation = false;
         }
     }
     return(false);
 }
Example #23
0
        private void button7_Click(object sender, EventArgs e)
        {
            if (!(dataModel.SelectedItem is PolygonHelper ph2))
            {
                return;
            }

            double clipperScale = 10000000;
            var    hull         = DeepNest.simplifyFunction(new NFP()
            {
                Points = ph2.TransformedPoints()
            }, false, clipperScale);
            PolygonHelper ph = new PolygonHelper();

            ph.Polygon = hull;
            ph.Name    = "simplify";

            dataModel.AddItem(ph);
        }
Example #24
0
        private void button12_Click(object sender, EventArgs e)
        {
            var res = dataModel.GetPairOfSelectedNfps();

            if (res == null)
            {
                return;
            }
            NFP offs = null;

            offs = ClipperHelper.MinkowskiSum(res[0], res[1], checkBox2.Checked, checkBox3.Checked);
            if (offs != null)
            {
                PolygonHelper ph = new PolygonHelper();
                //ph.Polygon.Points = offs.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
                ph.Polygon = DeepNest.clone2(offs);

                dataModel.AddItem(ph);
            }
        }
Example #25
0
        private void extractChildsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataModel.SelectedItems.Length == 0)
            {
                return;
            }
            var hh = dataModel.SelectedItem;

            if (!(hh is PolygonHelper ph))
            {
                return;
            }

            foreach (var item in ph.Polygon.Childrens)
            {
                PolygonHelper ph2 = new PolygonHelper();
                ph2.Polygon = DeepNest.clone(item);
                dataModel.AddItem(ph2);
            }
        }
Example #26
0
        public void AreaOk1()
        {
            var points = new Point[]
            {
                new Point(-5.26, 3.37),
                new Point(-3.66, -2.67),
                new Point(5.84, -1.55),
                new Point(1.36, 0.79),
                new Point(2.2, 6.27),
                new Point(-1.68, 1.61)
            };
            var etalon = 39.02;

            var(a, e) = PolygonHelper.Area(points);

            Console.WriteLine($"Error:{e.ToString()}\r\nAnswer:{a.ToString(PrecisionPoly)}\r\nEtalon:{etalon.ToString(PrecisionPoly)}");

            Assert.AreEqual(Errors.None, e);
            Assert.AreEqual(etalon.ToString(PrecisionPoly), a.ToString(PrecisionPoly));
        }
Example #27
0
        private void button13_Click(object sender, EventArgs e)
        {
            var res = dataModel.GetPairOfSelectedNfps();

            if (res == null)
            {
                return;
            }
            var p    = res[0];
            var p2   = res[1];
            var offs = DeepNest.getOuterNfp(p, p2);

            if (offs != null)
            {
                PolygonHelper ph = new PolygonHelper();
                //ph.Polygon.Points = offs.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
                ph.Polygon = DeepNest.clone2(offs);

                dataModel.AddItem(ph);
            }
        }
 /// <summary>
 /// Sets the poly polygon points to the shape.
 /// </summary>
 /// <param name="points">The points.</param>
 virtual public void SetPolyPolygonPoints(List <List <PolyPointDescriptor> > points)
 {
     //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
     //watch.Restart();
     try
     {
         Task t = new Task(
             () =>
         {
             LockValidation = true;
             try { PolygonHelper.SetPolyPoints(Shape, points, false, GetDocument()); }
             finally { LockValidation = false; }
         }
             );
         t.Start();
     }
     finally
     {
         //watch.Stop();
         //System.Diagnostics.Debug.WriteLine("Ticks for handling Polygon setting Points:" + watch.ElapsedTicks + " / Milliseconds:" + watch.ElapsedMilliseconds);
     }
 }
Example #29
0
        private void button15_Click(object sender, EventArgs e)
        {
            var res = dataModel.GetPairOfSelectedNfps();

            if (res == null)
            {
                return;
            }
            var p    = res[0];
            var p2   = res[1];
            var offs = DeepNest.Convolve(p2, p);

            if (offs != null)
            {
                foreach (var item in offs)
                {
                    PolygonHelper ph = new PolygonHelper();
                    //ph.Polygon.Points = item.Points.Select(z => new SvgPoint(z.X, z.Y)).ToArray();
                    ph.Polygon = DeepNest.clone2(item);
                    dataModel.AddItem(ph);
                }
            }
        }
        /// <summary>
        /// Gets the direct access to the poly polygon points.
        /// </summary>
        /// <returns>list of polygon point lists</returns>
        virtual public List <List <PolyPointDescriptor> > GetPolyPolygonPoints()
        {
            var points = PolygonHelper.GetPolyPoints(Shape);

            return(points);
        }