Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }