void CreateBorder(VertexStore vxs, Vertex2d prev, Vertex2d now, Vertex2d next0, Vertex2d next1) { //now we are on now using (Tools.BorrowVxs(out var vxs1)) { vxs.AddMoveTo(now.x, now.y); //create outer line-join _strokeMath.CreateJoin(vxs1, prev, now, next0); vxs.AppendVertexStore(vxs1); //create inner line join //next outer line join vxs1.Clear();//reuse _strokeMath.CreateJoin(vxs1, now, next0, next1); vxs.AppendVertexStore(vxs1); vxs.AddLineTo(next0.x, next0.y); vxs.AddCloseFigure(); } }
public VertexCmd GetNextVertex(ref double x, ref double y) { VertexCmd cmd = VertexCmd.LineTo; while (!VertexHelper.IsEmpty(cmd)) { switch (m_status) { case StrokeMath.Status.Init: this.RewindZero(); goto case StrokeMath.Status.Ready; case StrokeMath.Status.Ready: if (vertexDistanceList.Count < 2 + (m_closed ? 1 : 0)) { cmd = VertexCmd.Stop; break; } m_status = StrokeMath.Status.Outline1; cmd = VertexCmd.MoveTo; m_src_vertex = 0; m_out_vertex = 0; goto case StrokeMath.Status.Outline1; case StrokeMath.Status.Outline1: if (m_src_vertex >= vertexDistanceList.Count) { m_status = StrokeMath.Status.EndPoly1; break; } m_stroker.CreateJoin(m_out_vertices, vertexDistanceList.prev(m_src_vertex), vertexDistanceList.curr(m_src_vertex), vertexDistanceList.next(m_src_vertex), vertexDistanceList.prev(m_src_vertex).dist, vertexDistanceList.curr(m_src_vertex).dist); ++m_src_vertex; m_status = StrokeMath.Status.OutVertices; m_out_vertex = 0; goto case StrokeMath.Status.OutVertices; case StrokeMath.Status.OutVertices: if (m_out_vertex >= m_out_vertices.Count) { m_status = StrokeMath.Status.Outline1; } else { m_out_vertices.GetVertex(m_out_vertex++, out x, out y); return(cmd); } break; case StrokeMath.Status.EndPoly1: if (!m_closed) { return(VertexCmd.Stop); } m_status = StrokeMath.Status.Stop; x = (int)EndVertexOrientation.CCW; return(VertexCmd.CloseAndEndFigure); case StrokeMath.Status.Stop: return(VertexCmd.Stop); } } return(cmd); }