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