コード例 #1
0
        /// <summary>
        /// item の線対称の値をセット
        /// </summary>
        /// <param name="item"></param>
        /// <param name="partIndex"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        internal void ApplyOtherValue(SvgPathItem item, int partIndex, Vector2 start, Vector2 end)
        {
            if (item.IsC() || IsC())
            {
                switch (Command)
                {
                case 'L':
                case 'l':
                case 'M':
                case 'm':
                {
                    if (item.IsC())
                    {
                        // 自分の次はCで無いとつじつまが合わない
                        var next = this.Next;
                        if (next == null || !next.IsC())
                        {
                            return;
                        }

                        if (partIndex == 2)
                        {
                            points[0] = CalcSymmetricPoint(item.GetPoint(partIndex), start, end);
                        }
                        if (partIndex == 2 || partIndex == 1)
                        {
                            var v = CalcSymmetricPoint(item.GetPoint(1), start, end);
                            next.SetPoint(v, 0);
                        }
                        if (partIndex == 0)
                        {
                            var v = CalcSymmetricPoint(item.GetPoint(1), start, end);
                            next.SetPoint(v, 1);
                        }
                    }
                    break;
                }

                case 'c':
                case 'C':
                    // 自分が C
                    if (item.IsC())
                    {
                        if (partIndex == 2)     //終点 この場合は全体を移動
                        {
                            {
                                var v = CalcSymmetricPoint(item.GetPoint(), start, end);
                                SetPoint(v, 2);
                            }
                            // 制御点をitemの制御点にあわせる
                            {
                                // item の終点の制御点を next の始点の制御点に
                                var next = this.Next;
                                if (next != null && next.IsC())
                                {
                                    var v = CalcSymmetricPoint(item.GetPoint(1), start, end);
                                    next.SetPoint(v, 0);
                                }
                            }
                            {
                                // item の 次の始点の制御点を this の終点の制御点に
                                var next = item.Next;

                                if (next != null && next.IsC())
                                {
                                    var v = CalcSymmetricPoint(next.GetPoint(0), start, end);
                                    SetPoint(v, 1);
                                }
                            }
                        }
                        else if (partIndex == 0)
                        {
                            // 相手側の始点制御点の変更 なので、相手側の対象点を自分の次のアイテムの終点制御点へ
                            var next = this.Next;
                            if (next != null && next.IsC())
                            {
                                var v = CalcSymmetricPoint(item.GetPoint(0), start, end);
                                next.SetPoint(v, 1);
                            }
                        }
                    }
                    else if (item.IsL() || item.IsM())
                    {
                        // itemの次はCで無いとつじつまが合わない
                        var next = item.Next;
                        if (next == null || !next.IsC())
                        {
                            return;
                        }

                        {
                            var v = CalcSymmetricPoint(item.GetPoint(), start, end);
                            SetPoint(v, 2);
                        }

                        {
                            var v = CalcSymmetricPoint(next.GetPoint(0), start, end);
                            SetPoint(v, 1);
                        }
                    }
                    break;
                }
            }
            else if (item.IsL() || item.IsM())
            {
                switch (Command)
                {
                case 'L':
                case 'l':
                case 'M':
                case 'm':
                {
                    points[0] = CalcSymmetricPoint(item.GetPoint(), start, end);
                }
                break;
                }
            }
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="path"></param>
        /// <param name="index">自分のindex</param>
        /// <param name="step"></param>
        /// <returns></returns>
        internal bool RoundCorner(List <SvgPathItem> path, int index, float step)
        {
            SvgPathItem b1 = path[index - 1]; // 自分はCなので最低Mは存在する。
            var         p1 = b1.GetPoint();
            var         p3 = GetPoint();
            SvgPathItem b2 = null;

            if (index >= 2)
            {
                b2 = path[index - 2];
            }
            else
            {
                var item = path[path.Count - 1];
                if (item.IsZ())
                {
                    b2 = path[path.Count - 2];
                    var p = b2.GetPoint();
                    if (p == p1)
                    {
                        if (b2.IsL())
                        {
                            b2 = null;
                        }
                    }
                }
            }
            if (b2 == null)
            {
                return(false);
            }
            var         p2 = b2.GetPoint();
            SvgPathItem n1 = null;

            if (index <= path.Count - 2)
            {
                n1 = path[index + 1];
                if (n1.IsZ())
                {
                    n1 = path[0];
                    var p = n1.GetPoint();
                    if (p == p3)
                    {
                        n1 = path[1];
                        if (!n1.IsL())
                        {
                            return(false);
                        }
                    }
                }
            }
            else
            {
                return(false);
            }
            // 交点求める公式より
            var   p4  = n1.GetPoint();
            float dev = (p2.Y - p1.Y) * (p4.X - p3.X) - (p2.X - p1.X) * (p4.Y - p3.Y);

            if (dev == 0)
            {
                return(false);
            }
            float d1 = p3.Y * p4.X - p3.X * p4.Y;
            float d2 = p1.Y * p2.X - p1.X * p2.Y;
            float x  = d1 * (p2.X - p1.X) - d2 * (p4.X - p3.X);

            x /= dev;
            float y = d1 * (p2.Y - p1.Y) - d2 * (p4.Y - p3.Y);

            y /= dev;



            if (RoundSub(new Vector2(x, y), p2, p4, ref p1, ref p3, step))
            {
                SvgPathData.SetPreviusPoint(path, index, p1);
                SvgPathData.SetSameNextPoint(path, index);
                return(true);
            }
            return(false);
        }