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(); } //----------------- }
/// <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); } }