//-------------------------------------------------------------------- public static void InvertPolygon(VertexStore myvxs, int start) { // Skip all non-vertices at the beginning int vcount = myvxs.Count; while (start < vcount && !VertexHelper.IsVertextCommand(myvxs.GetCommand(start))) { ++start; } // Skip all insignificant move_to while (start + 1 < vcount && VertexHelper.IsMoveTo(myvxs.GetCommand(start)) && VertexHelper.IsMoveTo(myvxs.GetCommand(start + 1))) { ++start; } // Find the last vertex int end = start + 1; while (end < vcount && !VertexHelper.IsNextPoly(myvxs.GetCommand(end))) { ++end; } InvertPolygon(myvxs, start, end); }
//---------------------------------------------------------------- // Arrange the orientation of a polygon, all polygons in a path, // or in all paths. After calling arrange_orientations() or // arrange_orientations_all_paths(), all the polygons will have // the same orientation, i.e. path_flags_cw or path_flags_ccw //-------------------------------------------------------------------- static int ArrangePolygonOrientation(VertexStore myvxs, int start, bool clockwise) { //if (orientation == ShapePath.FlagsAndCommand.FlagNone) return start; // Skip all non-vertices at the beginning //ShapePath.FlagsAndCommand orientFlags = clockwise ? ShapePath.FlagsAndCommand.FlagCW : ShapePath.FlagsAndCommand.FlagCCW; int vcount = myvxs.Count; while (start < vcount && !VertexHelper.IsVertextCommand(myvxs.GetCommand(start))) { ++start; } // Skip all insignificant move_to while (start + 1 < vcount && VertexHelper.IsMoveTo(myvxs.GetCommand(start)) && VertexHelper.IsMoveTo(myvxs.GetCommand(start + 1))) { ++start; } // Find the last vertex int end = start + 1; while (end < vcount && !VertexHelper.IsNextPoly(myvxs.GetCommand(end))) { ++end; } if (end - start > 2) { bool isCW; if ((isCW = IsCW(myvxs, start, end)) != clockwise) { // Invert polygon, set orientation flag, and skip all end_poly InvertPolygon(myvxs, start, end); VertexCmd flags; int myvxs_count = myvxs.Count; var orientFlags = isCW ? (int)EndVertexOrientation.CW : (int)EndVertexOrientation.CCW; while (end < myvxs_count && VertexHelper.IsEndFigure(flags = myvxs.GetCommand(end))) { myvxs.ReplaceVertex(end++, orientFlags, 0); //myvxs.ReplaceCommand(end++, flags | orientFlags);// Path.set_orientation(cmd, orientation)); } } } return(end); }
static void InvertPolygon(VertexStore myvxs, int start, int end) { int i; VertexCmd tmp_PathAndFlags = myvxs.GetCommand(start); --end; // Make "end" inclusive // Shift all commands to one position for (i = start; i < end; i++) { myvxs.ReplaceCommand(i, myvxs.GetCommand(i + 1)); } // Assign starting command to the ending command myvxs.ReplaceCommand(end, tmp_PathAndFlags); // Reverse the polygon while (end > start) { myvxs.SwapVertices(start++, end--); } }
static int ArrangeOrientations(VertexStore myvxs, int start, bool closewise) { while (start < myvxs.Count) { start = ArrangePolygonOrientation(myvxs, start, closewise); if (VertexHelper.IsEmpty(myvxs.GetCommand(start))) { ++start; break; } } return(start); }