/// <summary> /// 現在の座標を指定されたいテムを指定した角度回転した値にセット。 /// </summary> /// <param name="item0"></param> /// <param name="partIndex"></param> /// <param name="center"></param> /// <param name="da"></param> internal void ApplyOtherValue2(SvgPathItem item0, int partIndex, Vector2 center, float da) { switch (Command) { case 'C': case 'c': { if (item0.IsC()) { if (partIndex == 2 || partIndex == 1) { Vector2 p = item0.GetPoint(); Vector2 ps = GetPoint(); p = CalcRotatePosition(p, center, da); points[2] = p; // コントロールポイント2も同様に、 var cp2 = item0.GetControlPoint(true); cp2 = CalcRotatePosition(cp2, center, da); points[1] = cp2; // 隣のコントロールポイント1も同様に var nexti = FindNext(); if (nexti.IsC()) { nexti.ControlRotate(0, center, ps, p); } } else if (partIndex == 0) { /* * SvgPathItem item = item0.FindBefor(); * Vector2 p = item.GetPoint(); * * p = CalcRotatePosition(p, center, da); * var itemb = FindBefor(); * itemb.SetPoint(p); * * // コントロールポイント * var cp1 = item0.GetControlPoint(false); * cp1 = CalcRotatePosition(p, center, da); * points[0] = cp1; */ var p = item0.GetControlPoint(false); p = CalcRotatePosition(p, center, da); points[0] = p; } } break; } case 'M': case 'l': case 'L': { Vector2 p = item0.GetPoint(); p = CalcRotatePosition(p, center, da); points[0] = p; break; } } }
/// <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 void AdjustSymmetric(SvgPathItem item) { if (!IsC() || !item.IsC()) { return; } var c = item.GetControlPoint(true); var p = item.GetPoint(); c.X = p.X + (p.X - c.X); c.Y = p.Y + (p.Y - c.Y); points[0] = c; }
/// <summary> /// 中心を返す、循環してなかったらnullを返す /// </summary> /// <returns></returns> private Vector2?CalcCenter() { // 先頭を探す var top = FindTop(); SvgPathItem last = null; int count = PathCount(ref last); int offset = last.IsC() ? 1 : 0; var item0 = top; var n1 = count / 2; var item1 = top;// = m_path[n1]; int index = 0; for (; ;) { if (item1.Next == null) { return(null); } if (index == n1) { break; } item1 = item1.Next; index++; } var p0 = item0.GetPoint(); var p1 = item1.GetPoint(); float x = MathF.Round((float)(p0.X + p1.X) / 2); float y = MathF.Round((float)(p0.Y + p1.Y) / 2); System.Diagnostics.Debug.WriteLine("中心 {0:0.00},{1:0.00}", x, y); return(new Vector2(x, y)); }
/// <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; } } }