Example #1
0
            void ClearCollectedTmpPoints(out double tmp_expectedLen)
            {
                //clear all previous collected points
                int j = _tempPoints.Count;

                tmp_expectedLen = 0;
                if (j > 0)
                {
                    tmp_expectedLen = _expectedSegmentLen;
                    for (int i = 0; i < j;)
                    {
                        //p0-p1
                        TmpPoint p0 = _tempPoints[i];
                        TmpPoint p1 = _tempPoints[i + 1];
                        //-------------------------------
                        //a series of connected line
                        //if ((_nextMarkNo % 2) == 1)
                        //{
                        //    if (i == 0)
                        //    {
                        //        //move to
                        //        _output.AddMoveTo(p0.x, p0.y);
                        //    }
                        //    _output.AddLineTo(p1.x, p1.y);
                        //}
                        if (i == 0)
                        {
                            //1st move to
                            _currentMarker.lineSegDel(_output, VertexCmd.MoveTo, p0.x, p0.y);
                        }
                        _currentMarker.lineSegDel(_output, VertexCmd.LineTo, p1.x, p1.y);

                        //-------------------------------
                        double len = AggMath.calc_distance(p0.x, p0.y, p1.x, p1.y);
                        tmp_expectedLen -= len;
                        i        += 2;
                        _latest_X = p1.x;
                        _latest_Y = p1.y;
                    }
                    //------------



                    _tempPoints.Clear();
                }
                //-----------------
            }
Example #2
0
        /// <summary>
        /// create polygon from flatten curve outline point
        /// </summary>
        /// <param name="cnt"></param>
        /// <returns></returns>
        static Poly2Tri.Polygon CreatePolygon2(GlyphContour cnt)
        {
            List <Poly2Tri.TriangulationPoint> points = new List <Poly2Tri.TriangulationPoint>();
            List <GlyphPart> allParts = cnt.parts;
            //---------------------------------------
            //merge all generated points
            //also remove duplicated point too!
            List <GlyphPoint2D> mergedPoints = new List <GlyphPoint2D>();

            cnt.mergedPoints = mergedPoints;
            //---------------------------------------
            {
                int tt = 0;
                int j  = allParts.Count;

                for (int i = 0; i < j; ++i)
                {
                    GlyphPart p = allParts[i];

                    List <GlyphPoint2D> fpoints = p.GetFlattenPoints();
                    if (tt == 0)
                    {
                        int n = fpoints.Count;
                        for (int m = 0; m < n; ++m)
                        {
                            //GlyphPoint2D fp = fpoints[m];
                            mergedPoints.Add(fpoints[m]);
                            //allPoints.Add((float)fp.x);
                            //allPoints.Add((float)fp.y);
                        }
                        tt++;
                    }
                    else
                    {
                        //except first point
                        int n = fpoints.Count;
                        for (int m = 1; m < n; ++m)
                        {
                            //GlyphPoint2D fp = fpoints[m];
                            mergedPoints.Add(fpoints[m]);
                            //allPoints.Add((float)fp.x);
                            //allPoints.Add((float)fp.y);
                        }
                    }
                }
            }
            //---------------------------------------
            {
                //check last (x,y) and first (x,y)
                int lim = mergedPoints.Count - 1;
                {
                    if (mergedPoints[lim].IsEqualValues(mergedPoints[0]))
                    {
                        //remove last (x,y)
                        mergedPoints.RemoveAt(lim);
                        lim -= 1;
                    }
                }

                //limitation: poly tri not accept duplicated points!
                double prevX = 0;
                double prevY = 0;
                Dictionary <TmpPoint, bool> tmpPoints = new Dictionary <TmpPoint, bool>();
                lim = mergedPoints.Count;

                for (int i = 0; i < lim; ++i)
                {
                    GlyphPoint2D p = mergedPoints[i];
                    double       x = p.x;
                    double       y = p.y;

                    if (x == prevX && y == prevY)
                    {
                        if (i > 0)
                        {
                            throw new NotSupportedException();
                        }
                    }
                    else
                    {
                        TmpPoint tmp_point = new TmpPoint(x, y);
                        if (!tmpPoints.ContainsKey(tmp_point))
                        {
                            //ensure no duplicated point
                            tmpPoints.Add(tmp_point, true);
                            var userTriangulationPoint = new Poly2Tri.TriangulationPoint(x, y)
                            {
                                userData = p
                            };
                            p.triangulationPoint = userTriangulationPoint;
                            points.Add(userTriangulationPoint);
                        }
                        else
                        {
                            throw new NotSupportedException();
                        }

                        prevX = x;
                        prevY = y;
                    }
                }

                Poly2Tri.Polygon polygon = new Poly2Tri.Polygon(points.ToArray());
                return(polygon);
            }
        }