Exemplo n.º 1
0
 public static void set_edge(QuadraticBezierCurve curve)
 {
     if (first)
     {
         writer.Write("M" + curve.begin_uv.x * scale + "," + (1 - curve.begin_uv.y) * scale);
         first = false;
     }
     writer.Write(" Q" + curve.control_uv.x * scale + "," + (1 - curve.control_uv.y) * scale);
     writer.Write(" " + curve.end_uv.x * scale + "," + (1 - curve.end_uv.y) * scale);
 }
Exemplo n.º 2
0
        private static void subdivide(Arc arc, float begin_point_angle, float end_point_angle)
        {
            float middle_point_angle = max_error_location(arc, begin_point_angle, end_point_angle);

            Vector3 begin  = arc.position(begin_point_angle);
            Vector3 middle = arc.position(middle_point_angle);
            Vector3 end    = arc.position(end_point_angle);

            OctahedronUVCoordinates begin_point  = new NormalizedCartesianCoordinates(begin);
            OctahedronUVCoordinates middle_point = new NormalizedCartesianCoordinates(middle);
            OctahedronUVCoordinates end_point    = new NormalizedCartesianCoordinates(end);

            if (PlanetariaMath.point_line_distance(begin_point.data, end_point.data, middle_point.data) > Precision.threshold) // if the max error is greater than a threshold, recursively add the left and right halves into the list of lines
            {
                subdivide(arc, begin_point_angle, middle_point_angle);
                subdivide(arc, middle_point_angle, end_point_angle);
            }
            else
            {
                QuadraticBezierCurve curve = new QuadraticBezierCurve(begin_point.data, middle_point.data, end_point.data);
                VectorGraphicsWriter.set_edge(curve);
            }
        }