|
@@ -12,11 +12,6 @@ namespace SketchAssistant
|
|
|
public class FileImporter
|
|
|
{
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- Form1 program;
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
@@ -35,11 +30,15 @@ namespace SketchAssistant
|
|
|
|
|
|
|
|
|
|
|
|
- readonly int samplingRateEllipse = 24;
|
|
|
+ readonly int samplingRateEllipse = 12;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ readonly int samplingRateBezier = 101;
|
|
|
|
|
|
- public FileImporter(Form1 newProgram)
|
|
|
+ public FileImporter()
|
|
|
{
|
|
|
- program = newProgram;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -564,7 +563,6 @@ namespace SketchAssistant
|
|
|
private List<Line> parsePath(string[] currentElement)
|
|
|
{
|
|
|
List<String> pathElements = new List<string>();
|
|
|
-
|
|
|
for (int j = 0; j < currentElement.Length; j++)
|
|
|
{
|
|
|
if (currentElement[j].StartsWith("d="))
|
|
@@ -581,24 +579,613 @@ namespace SketchAssistant
|
|
|
}
|
|
|
List<Line> element = new List<Line>();
|
|
|
List<Point> currentLine = new List<Point>();
|
|
|
- Point mirroredBezierPoint;
|
|
|
- pathElements = PreparePathElements(pathElements);
|
|
|
-
|
|
|
- currentLine = parse_M(pathElements);
|
|
|
- while(!(pathElements.Count == 0){
|
|
|
- if (pathElements.First().Equals("M"))
|
|
|
+ double lastBezierControlPointX= 0;
|
|
|
+ double lastBezierControlPointY= 0;
|
|
|
+ double lastPositionX;
|
|
|
+ double lastPositionY;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ (List<Point>, double, double) valuesArc;
|
|
|
+ (List<Point>, double, double, double, double) valuesBezierCurve;
|
|
|
+ (Point, double, double) valuesSinglePoint = parse_M_Z_L(pathElements);
|
|
|
+ currentLine = new List<Point>();
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ String currentToken;
|
|
|
+ while (!(pathElements.Count == 0)){
|
|
|
+ currentToken = pathElements.First();
|
|
|
+ if (currentToken.Equals("M"))
|
|
|
{
|
|
|
- element.Add(new Line(currentLine));
|
|
|
- currentLine = parse_M(pathElements);
|
|
|
+ element.Add(new Line(currentLine));
|
|
|
+ valuesSinglePoint = parse_M_Z_L(pathElements);
|
|
|
+ currentLine = new List<Point>();
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
}
|
|
|
- else if (pathElements.First().Equals(""))
|
|
|
+ else if (currentToken.Equals("m"))
|
|
|
{
|
|
|
-
|
|
|
+ element.Add(new Line(currentLine));
|
|
|
+ valuesSinglePoint = parse_m_z_l(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine = new List<Point>();
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("Z"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_M_Z_L(pathElements);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ element.Add(new Line(currentLine));
|
|
|
+ currentLine = new List<Point>();
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("z"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_m_z_l(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ element.Add(new Line(currentLine));
|
|
|
+ currentLine = new List<Point>();
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("L"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_M_Z_L(pathElements);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("l"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_m_z_l(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("H"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_H(pathElements, lastPositionY);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("h"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_h(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("V"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_V(pathElements, lastPositionX);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("v"))
|
|
|
+ {
|
|
|
+ valuesSinglePoint = parse_v(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.Add(valuesSinglePoint.Item1);
|
|
|
+ lastPositionX = valuesSinglePoint.Item2;
|
|
|
+ lastPositionY = valuesSinglePoint.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("C"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_C(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("c"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_C(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("S"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_S(pathElements, lastPositionX, lastPositionY, lastBezierControlPointX, lastBezierControlPointY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("s"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_s(pathElements, lastPositionX, lastPositionY, lastBezierControlPointX, lastBezierControlPointY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("Q"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_Q(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("q"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_q(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("T"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_T(pathElements, lastPositionX, lastPositionY, lastBezierControlPointX, lastBezierControlPointY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("t"))
|
|
|
+ {
|
|
|
+ valuesBezierCurve = parse_t(pathElements, lastPositionX, lastPositionY, lastBezierControlPointX, lastBezierControlPointY);
|
|
|
+ currentLine.AddRange(valuesBezierCurve.Item1);
|
|
|
+ lastPositionX = valuesBezierCurve.Item2;
|
|
|
+ lastPositionY = valuesBezierCurve.Item3;
|
|
|
+ lastBezierControlPointX = valuesBezierCurve.Item4;
|
|
|
+ lastBezierControlPointY = valuesBezierCurve.Item5;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("A"))
|
|
|
+ {
|
|
|
+ valuesArc = parse_A(pathElements);
|
|
|
+ currentLine.AddRange(valuesArc.Item1);
|
|
|
+ lastPositionX = valuesArc.Item2;
|
|
|
+ lastPositionY = valuesArc.Item3;
|
|
|
+ }
|
|
|
+ else if (currentToken.Equals("a"))
|
|
|
+ {
|
|
|
+ valuesArc = parse_a(pathElements, lastPositionX, lastPositionY);
|
|
|
+ currentLine.AddRange(valuesArc.Item1);
|
|
|
+ lastPositionX = valuesArc.Item2;
|
|
|
+ lastPositionY = valuesArc.Item3;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ throw new FileImporterException("invalid path argument or path data formatting: read argument " + pathElements.First(), "valid path arguments are: {M,Z,L,H,V,C,S,Q,T,A} in upper and lower case", i + 1);
|
|
|
}
|
|
|
}
|
|
|
+ if (currentLine.Count > 1)
|
|
|
+ {
|
|
|
+ element.Add(new Line(currentLine));
|
|
|
+ }
|
|
|
return element;
|
|
|
- */
|
|
|
- return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (Point, double, double) parse_M_Z_L(List<string> pathElements)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ return (ScaleAndCreatePoint(x, y), x, y);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (Point, double, double) parse_m_z_l(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ x = lastPositionX + x;
|
|
|
+ y = lastPositionY + y;
|
|
|
+ return (ScaleAndCreatePoint(x, y), x, y);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (Point, double, double) parse_H(List<string> pathElements, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ return (ScaleAndCreatePoint(x, lastPositionY), x, lastPositionY);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (Point, double, double) parse_h(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ x = lastPositionX + x;
|
|
|
+ return (ScaleAndCreatePoint(x, lastPositionY), x, lastPositionY);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (Point, double, double) parse_V(List<string> pathElements, double lastPositionX)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ return (ScaleAndCreatePoint(lastPositionX, y), lastPositionX, y);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (Point, double, double) parse_v(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ y = lastPositionY + y;
|
|
|
+ return (ScaleAndCreatePoint(lastPositionX, y), lastPositionX, y);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_C(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ return (SampleCubicBezier(lastPositionX, lastPositionY, x1, y1, x2, y2, x, y), x, y, x2, y2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_c(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ x1 = lastPositionX + x1;
|
|
|
+ y1 = lastPositionY + y1;
|
|
|
+ x2 = lastPositionX + x2;
|
|
|
+ y2 = lastPositionY + y2;
|
|
|
+ x = lastPositionX + x;
|
|
|
+ y = lastPositionY + y;
|
|
|
+ return (SampleCubicBezier(lastPositionX, lastPositionY, x1, y1, x2, y2, x, y), x, y, x2, y2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_S(List<string> pathElements, double lastPositionX, double lastPositionY, double lastBezierControlPointX, double lastBezierControlPointY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = lastPositionX + (lastPositionX - lastBezierControlPointX);
|
|
|
+ double y1 = lastPositionY + (lastPositionY - lastBezierControlPointY);
|
|
|
+ return (SampleCubicBezier(lastPositionX, lastPositionY, x1, y1, x2, y2, x, y), x, y, x2, y2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_s(List<string> pathElements, double lastPositionX, double lastPositionY, double lastBezierControlPointX, double lastBezierControlPointY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y2 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = lastPositionX + (lastPositionX - lastBezierControlPointX);
|
|
|
+ double y1 = lastPositionY + (lastPositionY - lastBezierControlPointY);
|
|
|
+ x2 = lastPositionX + x2;
|
|
|
+ y2 = lastPositionY + y2;
|
|
|
+ x = lastPositionX + x;
|
|
|
+ y = lastPositionY + y;
|
|
|
+ return (SampleCubicBezier(lastPositionX, lastPositionY, x1, y1, x2, y2, x, y), x, y, x2, y2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_Q(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ return (SampleQuadraticBezier(lastPositionX, lastPositionY, x1, y1, x, y), x, y, x1, y1);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_q(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y1 = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ x1 = lastPositionX + x1;
|
|
|
+ y1 = lastPositionY + y1;
|
|
|
+ x = lastPositionX + x;
|
|
|
+ y = lastPositionY + y;
|
|
|
+ return (SampleQuadraticBezier(lastPositionX, lastPositionY, x1, y1, x, y), x, y, x1, y1);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_T(List<string> pathElements, double lastPositionX, double lastPositionY, double lastBezierControlPointX, double lastBezierControlPointY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x1 = lastPositionX + (lastPositionX - lastBezierControlPointX);
|
|
|
+ double y1 = lastPositionY + (lastPositionY - lastBezierControlPointY);
|
|
|
+ return (SampleQuadraticBezier(lastPositionX, lastPositionY, x1, y1, x, y), x, y, x1, y1);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (List<Point>, double, double, double, double) parse_t(List<string> pathElements, double lastPositionX, double lastPositionY, double lastBezierControlPointX, double lastBezierControlPointY)
|
|
|
+ {
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double x = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ double y = Convert.ToDouble(pathElements.First(), CultureInfo.InvariantCulture);
|
|
|
+ pathElements.RemoveAt(0);
|
|
|
+ x = lastPositionX + x;
|
|
|
+ y = lastPositionY + y;
|
|
|
+ double x1 = lastPositionX + (lastPositionX - lastBezierControlPointX);
|
|
|
+ double y1 = lastPositionY + (lastPositionY - lastBezierControlPointY);
|
|
|
+ return (SampleQuadraticBezier(lastPositionX, lastPositionY, x1, y1, x, y), x, y, x1, y1);
|
|
|
+ }
|
|
|
+
|
|
|
+ private (List<Point>, double, double) parse_A(List<string> pathElements)
|
|
|
+ {
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+
|
|
|
+ private (List<Point>, double, double) parse_a(List<string> pathElements, double lastPositionX, double lastPositionY)
|
|
|
+ {
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private List<Point> SampleCubicBezier(double lastPositionX, double lastPositionY, double controlPoint1X, double controlPoint1Y, double controlPoint2X, double controlPoint2Y, double nextPositionX, double nextPositionY)
|
|
|
+ {
|
|
|
+ (double[], double[]) line1 = CreateDiscreteLine(lastPositionX, lastPositionY, controlPoint1X, controlPoint1Y);
|
|
|
+ (double[], double[]) line2 = CreateDiscreteLine(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y);
|
|
|
+ (double[], double[]) line3 = CreateDiscreteLine(controlPoint2X, controlPoint2Y, nextPositionX, nextPositionY);
|
|
|
+ (double[], double[]) quadraticBezier1 = computeBezierStep(line1.Item1, line1.Item2, line2.Item1, line2.Item2);
|
|
|
+ (double[], double[]) quadraticBezier2 = computeBezierStep(line2.Item1, line2.Item2, line3.Item1, line3.Item2);
|
|
|
+ (double[], double[]) values = computeBezierStep(quadraticBezier1.Item1, quadraticBezier1.Item2, quadraticBezier2.Item1, quadraticBezier2.Item2);
|
|
|
+ List<Point> result = new List<Point>();
|
|
|
+ for (int j = 0; j < samplingRateBezier; j++)
|
|
|
+ {
|
|
|
+ result.Add(ScaleAndCreatePoint(values.Item1[j], values.Item2[j]));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private List<Point> SampleQuadraticBezier(double lastPositionX, double lastPositionY, double controlPointX, double controlPointY, double nextPositionX, double nextPositionY)
|
|
|
+ {
|
|
|
+ (double[], double[]) line1 = CreateDiscreteLine(lastPositionX, lastPositionY, controlPointX, controlPointY);
|
|
|
+ (double[], double[]) line2 = CreateDiscreteLine(controlPointX, controlPointY, nextPositionX, nextPositionY);
|
|
|
+ (double[], double[]) values = computeBezierStep(line1.Item1, line1.Item2, line2.Item1, line2.Item2);
|
|
|
+ List<Point> result = new List<Point>();
|
|
|
+ for (int j = 0; j < samplingRateBezier; j++)
|
|
|
+ {
|
|
|
+ result.Add(ScaleAndCreatePoint(values.Item1[j], values.Item2[j]));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (double[], double[]) CreateDiscreteLine(double point1X, double point1Y, double point2X, double point2Y)
|
|
|
+ {
|
|
|
+ double[] resultX = new double[samplingRateBezier];
|
|
|
+ double[] resultY = new double[samplingRateBezier];
|
|
|
+ for (int j = 0; j < samplingRateBezier; j++)
|
|
|
+ {
|
|
|
+ (double, double) pointResult = LinearInterpolationForBezier(point1X, point1Y, point2X, point2Y, j);
|
|
|
+ resultX[j] = pointResult.Item1;
|
|
|
+ resultY[j] = pointResult.Item2;
|
|
|
+ }
|
|
|
+ return (resultX, resultY);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (double[], double[]) computeBezierStep(double[] line1X, double[] line1Y, double[] line2X, double[] line2Y)
|
|
|
+ {
|
|
|
+ double[] resultX = new double[samplingRateBezier];
|
|
|
+ double[] resultY = new double[samplingRateBezier];
|
|
|
+ for (int j = 0; j < samplingRateBezier; j++)
|
|
|
+ {
|
|
|
+ (double, double) pointResult = LinearInterpolationForBezier(line1X[j], line1Y[j], line2X[j], line2Y[j], j);
|
|
|
+ resultX[j] = pointResult.Item1;
|
|
|
+ resultY[j] = pointResult.Item2;
|
|
|
+ }
|
|
|
+ return (resultX, resultY);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private (double, double) LinearInterpolationForBezier(double point1X, double point1Y, double point2X, double point2Y, int j)
|
|
|
+ {
|
|
|
+ double factor = ((double)1 / (double)(samplingRateBezier - 1)) * (double)j;
|
|
|
+ double x = point1X + ((point2X - point1X) * factor);
|
|
|
+ double y = point1Y + ((point2Y - point1Y) * factor);
|
|
|
+ return (x, y);
|
|
|
}
|
|
|
|
|
|
|