/// <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); }
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); } } }
/// <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; } } }