示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        internal bool ValueChange(float x, float y)
        {
            if (CurrentIndex.IsValid())
            {
                var m_path = Paths[CurrentIndex.BlockIndex];
                var item   = m_path[CurrentIndex.ItemIndex];
                item.ValueChange(CurrentIndex.PartIndex, x, y);
                if (item.IsC() && CurrentIndex.PartIndex == 2)
                {
                    int nextindex = CurrentIndex.ItemIndex + 1;
                    if (nextindex >= m_path.Count)
                    {
                        nextindex = 0;
                    }
                    SvgPathItem next = m_path[nextindex];
                    if (next.IsZ())
                    {
                        next = m_path[0];
                        if (next.IsM())
                        {
                            next.ValueChange(0, x, y);
                            nextindex = 1;
                            next      = m_path[nextindex];
                        }
                    }
                    if (next.IsC())
                    {
                        next.ValueChange(0, x, y);
                    }
                }

                return(true);
            }
            return(false);
        }
示例#2
0
        internal static void SetPreviusPoint(List <SvgPathItem> path, int index, Vector2 p1)
        {
            SvgPathItem pre = null;
            Vector2?    pm  = null;

            index--;
            if (index < 0)
            {
                index = path.Count - 1;
            }
            pre = path[index];
            if (pre.IsM())
            {
                pm = pre.GetPoint();
                pre.SetPoint(p1);
            }
            if (pre.IsZ())
            {
                index--;
                pre = path[index];
            }
            if (pm == null)
            {
                pre.SetPoint(p1);
            }
            else
            {
                var p = pre.GetPoint();
                if (p == pm)
                {
                    pre.SetPoint(p1);
                }
            }
        }
示例#3
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;
                }
            }
        }