Exemplo n.º 1
0
void curve4_div::recursive_bezier(float x1, float y1,
                                  float x2, float y2,
                                  float x3, float y3,
                                  float x4, float y4,
                                  unsigned level)
{
    if(level > curve_recursion_limit) {
        return;
    }
    float x12   = (x1 + x2) / 2;
    float y12   = (y1 + y2) / 2;
    float x23   = (x2 + x3) / 2;
    float y23   = (y2 + y3) / 2;
    float x34   = (x3 + x4) / 2;
    float y34   = (y3 + y4) / 2;
    float x123  = (x12 + x23) / 2;
    float y123  = (y12 + y23) / 2;
    float x234  = (x23 + x34) / 2;
    float y234  = (y23 + y34) / 2;
    float x1234 = (x123 + x234) / 2;
    float y1234 = (y123 + y234) / 2;
    float dx = x4 - x1;
    float dy = y4 - y1;
    float d2 = fabs(((x2 - x4) * dy) - ((y2 - y4) * dx));
    float d3 = fabs(((x3 - x4) * dy) - ((y3 - y4) * dx));
    switch((int(d2 > curve_collinearity_epsilon) << 1) +
            int(d3 > curve_collinearity_epsilon)) {
        case 0:
          if (fabs(x1 + x3 - x2 - x2) + fabs(y1 + y3 - y2 - y2) +
                  fabs(x2 + x4 - x3 - x3) + fabs(y2 + y4 - y3 - y3) <=
              m_distance_tolerance_manhattan) {
            m_points.add(point_type(x1234, y1234, path_flags_jr));
            return;
            }
            break;
        case 1:
          if ((d3 * d3) <=
              (m_distance_tolerance_square * ((dx * dx) + (dy * dy)))) {
                m_points.add(point_type(x23, y23, path_flags_jr));
                return;
            }
            break;
        case 2:
          if ((d2 * d2) <=
              (m_distance_tolerance_square * ((dx * dx) + (dy * dy)))) {
                m_points.add(point_type(x23, y23, path_flags_jr));
                return;
            }
            break;
        case 3:
          if (((d2 + d3) * (d2 + d3)) <=
              (m_distance_tolerance_square * ((dx * dx) + (dy * dy)))) {
                m_points.add(point_type(x23, y23, path_flags_jr));
                return;
            }
            break;
    }
    recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1);
    recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1);
}
Exemplo n.º 2
0
void recursive_bezier(double x1, double y1,
	double x2, double y2,
	double x3, double y3,
	double x4, double y4,int check)
{
	// Calculate all the mid-points of the line segments
	//----------------------
	//printf("inside recursive bezier");
	//float x12, y12, x23, y23, x34, y34, x123, y123, x234, y234, x1234, y1234;
	
		float x12 = (x1 + x2) / 2;
		float y12 = (y1 + y2) / 2;
		float x23 = (x2 + x3) / 2;
		float y23 = (y2 + y3) / 2;
		float x34 = (x3 + x4) / 2;
		float y34 = (y3 + y4) / 2;
		float x123 = (x12 + x23) / 2;
		float y123 = (y12 + y23) / 2;
		float x234 = (x23 + x34) / 2;
		float y234 = (y23 + y34) / 2;
		float x1234 = (x123 + x234) / 2;
		float y1234 = (y123 + y234) / 2;

		if (check == 0){

		// Draw and stop
		//----------------------
		//draw_line(x1, y1, x4, y4);
		glColor3f(1.0, 0.0, 0.0);
		glBegin(GL_LINES);
		glVertex3f(x1, y1, 0.0);
		glVertex3f(x2, y2, 0.0);
		glEnd();

		glColor3f(1.0, 0.0, 0.0);
		glBegin(GL_LINES);
		glVertex3f(x2, y2, 0.0);
		glVertex3f(x3, y3, 0.0);
		glEnd();

		glColor3f(1.0, 0.0, 0.0);
		glBegin(GL_LINES);
		glVertex3f(x3, y3, 0.0);
		glVertex3f(x4, y4, 0.0);
		glEnd();
	}
		// Continue subdivision
		//----------------------
	else{
			recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234,check-1);

			recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4,check-1);
		}
		
	
}
Exemplo n.º 3
0
void display2()
{
	if (controlPointCount == 4)
		recursive_bezier(controlPoints[0][0], controlPoints[0][1], controlPoints[1][0], controlPoints[1][1], controlPoints[2][0], controlPoints[2][1], controlPoints[3][0], controlPoints[3][1],dcount);
	glutSwapBuffers();
	glutPostRedisplay();
}
Exemplo n.º 4
0
//------------------------------------------------------------------------
void curve3_div::bezier(double x1, double y1,
                        double x2, double y2,
                        double x3, double y3)
{
    m_points.add(point_d(x1, y1));
    recursive_bezier(x1, y1, x2, y2, x3, y3, 0);
    m_points.add(point_d(x3, y3));
}
Exemplo n.º 5
0
//------------------------------------------------------------------------
void phobos::system::agg::curve3_div::bezier(double x1, double y1, 
												double x2, double y2, 
												double x3, double y3)
{
	m_points.add(point_d(x1, y1));
	recursive_bezier(x1, y1, x2, y2, x3, y3, 0);
	m_points.add(point_d(x3, y3));
}
Exemplo n.º 6
0
//------------------------------------------------------------------------
void curve4_div::bezier(double x1, double y1,
                        double x2, double y2,
                        double x3, double y3,
                        double x4, double y4)
{
    m_points.add(point_d(x1, y1));
    recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);
    m_points.add(point_d(x4, y4));
}
Exemplo n.º 7
0
void curve4_div::bezier(float x1, float y1,
                        float x2, float y2,
                        float x3, float y3,
                        float x4, float y4)
{
    m_points.add(point_type(x1, y1));
    recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);
    m_points.add(point_type(x4, y4));
}
std::vector<wxPoint> Bezier2Poly( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 )
{
    s_bezier_Points_Buffer.clear();
    bezier_distance_tolerance_square  = 0.5 / bezier_approximation_scale;
    bezier_distance_tolerance_square *= bezier_distance_tolerance_square;

    s_bezier_Points_Buffer.push_back( wxPoint( x1, y1 ) );
    recursive_bezier( x1, y1, x2, y2, x3, y3, x4, y4, 0 );
    s_bezier_Points_Buffer.push_back( wxPoint( x4, y4 ) );
    wxLogDebug( wxT( "Bezier Conversion - End (%d vertex)" ), s_bezier_Points_Buffer.size() );
    return s_bezier_Points_Buffer;
}
Exemplo n.º 9
0
//------------------------------------------------------------------------
void curve4_div::recursive_bezier(double x1, double y1,
                                  double x2, double y2,
                                  double x3, double y3,
                                  double x4, double y4,
                                  unsigned level)
{
    if(level > curve_recursion_limit)
    {
        return;
    }

    // Calculate all the mid-points of the line segments
    //----------------------
    double x12   = (x1 + x2) / 2;
    double y12   = (y1 + y2) / 2;
    double x23   = (x2 + x3) / 2;
    double y23   = (y2 + y3) / 2;
    double x34   = (x3 + x4) / 2;
    double y34   = (y3 + y4) / 2;
    double x123  = (x12 + x23) / 2;
    double y123  = (y12 + y23) / 2;
    double x234  = (x23 + x34) / 2;
    double y234  = (y23 + y34) / 2;
    double x1234 = (x123 + x234) / 2;
    double y1234 = (y123 + y234) / 2;


    // Try to approximate the full cubic curve by a single straight line
    //------------------
    double dx = x4-x1;
    double dy = y4-y1;

    double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx));
    double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx));
    double da1, da2, k;

    switch((int(d2 > curve_collinearity_epsilon) << 1) +
           int(d3 > curve_collinearity_epsilon))
    {
    case 0:
        // All collinear OR p1==p4
        //----------------------
        k = dx*dx + dy*dy;
        if(k == 0)
        {
            d2 = calc_sq_distance(x1, y1, x2, y2);
            d3 = calc_sq_distance(x4, y4, x3, y3);
        }
        else
        {
            k   = 1 / k;
            da1 = x2 - x1;
            da2 = y2 - y1;
            d2  = k * (da1*dx + da2*dy);
            da1 = x3 - x1;
            da2 = y3 - y1;
            d3  = k * (da1*dx + da2*dy);
            if(d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1)
            {
                // Simple collinear case, 1---2---3---4
                // We can leave just two endpoints
                return;
            }
            if(d2 <= 0) d2 = calc_sq_distance(x2, y2, x1, y1);
            else if(d2 >= 1) d2 = calc_sq_distance(x2, y2, x4, y4);
            else             d2 = calc_sq_distance(x2, y2, x1 + d2*dx, y1 + d2*dy);

            if(d3 <= 0) d3 = calc_sq_distance(x3, y3, x1, y1);
            else if(d3 >= 1) d3 = calc_sq_distance(x3, y3, x4, y4);
            else             d3 = calc_sq_distance(x3, y3, x1 + d3*dx, y1 + d3*dy);
        }
        if(d2 > d3)
        {
            if(d2 < m_distance_tolerance_square)
            {
                m_points.add(point_d(x2, y2));
                return;
            }
        }
        else
        {
            if(d3 < m_distance_tolerance_square)
            {
                m_points.add(point_d(x3, y3));
                return;
            }
        }
        break;

    case 1:
        // p1,p2,p4 are collinear, p3 is significant
        //----------------------
        if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy))
        {
            if(m_angle_tolerance < curve_angle_tolerance_epsilon)
            {
                m_points.add(point_d(x23, y23));
                return;
            }

            // Angle Condition
            //----------------------
            da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2));
            if(da1 >= pi) da1 = 2*pi - da1;

            if(da1 < m_angle_tolerance)
            {
                m_points.add(point_d(x2, y2));
                m_points.add(point_d(x3, y3));
                return;
            }

            if(m_cusp_limit != 0.0)
            {
                if(da1 > m_cusp_limit)
                {
                    m_points.add(point_d(x3, y3));
                    return;
                }
            }
        }
        break;

    case 2:
        // p1,p3,p4 are collinear, p2 is significant
        //----------------------
        if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy))
        {
            if(m_angle_tolerance < curve_angle_tolerance_epsilon)
            {
                m_points.add(point_d(x23, y23));
                return;
            }

            // Angle Condition
            //----------------------
            da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1));
            if(da1 >= pi) da1 = 2*pi - da1;

            if(da1 < m_angle_tolerance)
            {
                m_points.add(point_d(x2, y2));
                m_points.add(point_d(x3, y3));
                return;
            }

            if(m_cusp_limit != 0.0)
            {
                if(da1 > m_cusp_limit)
                {
                    m_points.add(point_d(x2, y2));
                    return;
                }
            }
        }
        break;

    case 3:
        // Regular case
        //-----------------
        if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy))
        {
            // If the curvature doesn't exceed the distance_tolerance value
            // we tend to finish subdivisions.
            //----------------------
            if(m_angle_tolerance < curve_angle_tolerance_epsilon)
            {
                m_points.add(point_d(x23, y23));
                return;
            }

            // Angle & Cusp Condition
            //----------------------
            k   = atan2(y3 - y2, x3 - x2);
            da1 = fabs(k - atan2(y2 - y1, x2 - x1));
            da2 = fabs(atan2(y4 - y3, x4 - x3) - k);
            if(da1 >= pi) da1 = 2*pi - da1;
            if(da2 >= pi) da2 = 2*pi - da2;

            if(da1 + da2 < m_angle_tolerance)
            {
                // Finally we can stop the recursion
                //----------------------
                m_points.add(point_d(x23, y23));
                return;
            }

            if(m_cusp_limit != 0.0)
            {
                if(da1 > m_cusp_limit)
                {
                    m_points.add(point_d(x2, y2));
                    return;
                }

                if(da2 > m_cusp_limit)
                {
                    m_points.add(point_d(x3, y3));
                    return;
                }
            }
        }
        break;
    }

    // Continue subdivision
    //----------------------
    recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1);
    recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1);
}
Exemplo n.º 10
0
//------------------------------------------------------------------------
void curve3_div::recursive_bezier(double x1, double y1,
                                  double x2, double y2,
                                  double x3, double y3,
                                  unsigned level)
{
    if(level > curve_recursion_limit)
    {
        return;
    }

    // Calculate all the mid-points of the line segments
    //----------------------
    double x12   = (x1 + x2) / 2;
    double y12   = (y1 + y2) / 2;
    double x23   = (x2 + x3) / 2;
    double y23   = (y2 + y3) / 2;
    double x123  = (x12 + x23) / 2;
    double y123  = (y12 + y23) / 2;

    double dx = x3-x1;
    double dy = y3-y1;
    double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx));
    double da;

    if(d > curve_collinearity_epsilon)
    {
        // Regular case
        //-----------------
        if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy))
        {
            // If the curvature doesn't exceed the distance_tolerance value
            // we tend to finish subdivisions.
            //----------------------
            if(m_angle_tolerance < curve_angle_tolerance_epsilon)
            {
                m_points.add(point_d(x123, y123));
                return;
            }

            // Angle & Cusp Condition
            //----------------------
            da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1));
            if(da >= pi) da = 2*pi - da;

            if(da < m_angle_tolerance)
            {
                // Finally we can stop the recursion
                //----------------------
                m_points.add(point_d(x123, y123));
                return;
            }
        }
    }
    else
    {
        // Collinear case
        //------------------
        da = dx*dx + dy*dy;
        if(da == 0)
        {
            d = calc_sq_distance(x1, y1, x2, y2);
        }
        else
        {
            d = ((x2 - x1)*dx + (y2 - y1)*dy) / da;
            if(d > 0 && d < 1)
            {
                // Simple collinear case, 1---2---3
                // We can leave just two endpoints
                return;
            }
            if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1);
            else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3);
            else            d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy);
        }
        if(d < m_distance_tolerance_square)
        {
            m_points.add(point_d(x2, y2));
            return;
        }
    }

    // Continue subdivision
    //----------------------
    recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1);
    recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1);
}
Exemplo n.º 11
0
    //------------------------------------------------------------------------
    void curve4_div::recursive_bezier(double x1, double y1, 
                                      double x2, double y2, 
                                      double x3, double y3, 
                                      double x4, double y4,
                                      unsigned level)
    {
        if(level > curve_recursion_limit) 
        {
            return;
        }

        // Calculate all the mid-points of the line segments
        //----------------------
        double x12   = (x1 + x2) / 2;
        double y12   = (y1 + y2) / 2;
        double x23   = (x2 + x3) / 2;
        double y23   = (y2 + y3) / 2;
        double x34   = (x3 + x4) / 2;
        double y34   = (y3 + y4) / 2;
        double x123  = (x12 + x23) / 2;
        double y123  = (y12 + y23) / 2;
        double x234  = (x23 + x34) / 2;
        double y234  = (y23 + y34) / 2;
        double x1234 = (x123 + x234) / 2;
        double y1234 = (y123 + y234) / 2;

        // Try to approximate the full cubic curve by a single straight line
        //------------------
        double dx = x4-x1;
        double dy = y4-y1;

        double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx));
        double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx));
        double da1, da2;

        switch((int(d2 > curve_collinearity_epsilon) << 1) +
                int(d3 > curve_collinearity_epsilon))
        {
        case 0:
            // All collinear OR p1==p4
            //----------------------
            if(fabs(x1 + x3 - x2 - x2) +
               fabs(y1 + y3 - y2 - y2) +
               fabs(x2 + x4 - x3 - x3) +
               fabs(y2 + y4 - y3 - y3) <= m_distance_tolerance_manhattan)
            {
                m_points.add(point_d(x1234, y1234));
                return;
            }    
            break;

        case 1:
            // p1,p2,p4 are collinear, p3 is considerable
            //----------------------
            if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy))
            {
                if(m_angle_tolerance < curve_angle_tolerance_epsilon)
                {
                    m_points.add(point_d(x23, y23));
                    return;
                }

                // Angle Condition
                //----------------------
                da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2));
                if(da1 >= pi) da1 = 2*pi - da1;

                if(da1 < m_angle_tolerance)
                {
                    m_points.add(point_d(x2, y2));
                    m_points.add(point_d(x3, y3));
                    return;
                }

                if(m_cusp_limit != 0.0)
                {
                    if(da1 > m_cusp_limit)
                    {
                        m_points.add(point_d(x3, y3));
                        return;
                    }
                }
            }
            break;

        case 2:
            // p1,p3,p4 are collinear, p2 is considerable
            //----------------------
            if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy))
            {
                if(m_angle_tolerance < curve_angle_tolerance_epsilon)
                {
                    m_points.add(point_d(x23, y23));
                    return;
                }

                // Angle Condition
                //----------------------
                da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1));
                if(da1 >= pi) da1 = 2*pi - da1;

                if(da1 < m_angle_tolerance)
                {
                    m_points.add(point_d(x2, y2));
                    m_points.add(point_d(x3, y3));
                    return;
                }

                if(m_cusp_limit != 0.0)
                {
                    if(da1 > m_cusp_limit)
                    {
                        m_points.add(point_d(x2, y2));
                        return;
                    }
                }
            }
            break;

        case 3: 
            // Regular care
            //-----------------
            if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy))
            {
                // If the curvature doesn't exceed the distance_tolerance value
                // we tend to finish subdivisions.
                //----------------------
                if(m_angle_tolerance < curve_angle_tolerance_epsilon)
                {
                    m_points.add(point_d(x23, y23));
                    return;
                }

                // Angle & Cusp Condition
                //----------------------
                double a23 = atan2(y3 - y2, x3 - x2);
                da1 = fabs(a23 - atan2(y2 - y1, x2 - x1));
                da2 = fabs(atan2(y4 - y3, x4 - x3) - a23);
                if(da1 >= pi) da1 = 2*pi - da1;
                if(da2 >= pi) da2 = 2*pi - da2;

                if(da1 + da2 < m_angle_tolerance)
                {
                    // Finally we can stop the recursion
                    //----------------------
                    m_points.add(point_d(x23, y23));
                    return;
                }

                if(m_cusp_limit != 0.0)
                {
                    if(da1 > m_cusp_limit)
                    {
                        m_points.add(point_d(x2, y2));
                        return;
                    }

                    if(da2 > m_cusp_limit)
                    {
                        m_points.add(point_d(x3, y3));
                        return;
                    }
                }
            }
            break;
        }

        // Continue subdivision
        //----------------------
        recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); 
        recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); 
    }
Exemplo n.º 12
0
    //------------------------------------------------------------------------
    void curve3_div::recursive_bezier(double x1, double y1, 
                                      double x2, double y2, 
                                      double x3, double y3,
                                      unsigned level)
    {
        if(level > curve_recursion_limit) 
        {
            return;
        }

        // Calculate all the mid-points of the line segments
        //----------------------
        double x12   = (x1 + x2) / 2;                
        double y12   = (y1 + y2) / 2;
        double x23   = (x2 + x3) / 2;
        double y23   = (y2 + y3) / 2;
        double x123  = (x12 + x23) / 2;
        double y123  = (y12 + y23) / 2;

        double dx = x3-x1;
        double dy = y3-y1;
        double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx));

        if(d > curve_collinearity_epsilon)
        { 
            // Regular care
            //-----------------
            if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy))
            {
                // If the curvature doesn't exceed the distance_tolerance value
                // we tend to finish subdivisions.
                //----------------------
                if(m_angle_tolerance < curve_angle_tolerance_epsilon)
                {
                    m_points.add(point_d(x123, y123));
                    return;
                }

                // Angle & Cusp Condition
                //----------------------
                double da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1));
                if(da >= pi) da = 2*pi - da;

                if(da < m_angle_tolerance)
                {
                    // Finally we can stop the recursion
                    //----------------------
                    m_points.add(point_d(x123, y123));
                    return;                 
                }
            }
        }
        else
        {
            if(fabs(x1 + x3 - x2 - x2) +
               fabs(y1 + y3 - y2 - y2) <= m_distance_tolerance_manhattan)
            {
                m_points.add(point_d(x123, y123));
                return;
            }    
        }

        // Continue subdivision
        //----------------------
        recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); 
        recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); 
    }
void recursive_bezier( int x1, int y1, int x2, int y2, int x3, int y3, int level )
{
    if( abs( level ) > bezier_recursion_limit )
    {
        return;
    }

    // Calculate all the mid-points of the line segments
    //----------------------
    int    x12  = (x1 + x2) / 2;
    int    y12  = (y1 + y2) / 2;
    int    x23  = (x2 + x3) / 2;
    int    y23  = (y2 + y3) / 2;
    int    x123 = (x12 + x23) / 2;
    int    y123 = (y12 + y23) / 2;

    int    dx = x3 - x1;
    int    dy = y3 - y1;
    double d  = fabs( ((double) (x2 - x3) * dy) - ((double) (y2 - y3) * dx ) );
    double da;

    if( d > bezier_curve_collinearity_epsilon )
    {
        // Regular case
        //-----------------
        if( d * d <= bezier_distance_tolerance_square * (dx * dx + dy * dy) )
        {
            // If the curvature doesn't exceed the distance_tolerance value
            // we tend to finish subdivisions.
            //----------------------
            if( bezier_angle_tolerance < bezier_curve_angle_tolerance_epsilon )
            {
                add_segment( wxPoint( x123, y123 ) );
                return;
            }

            // Angle & Cusp Condition
            //----------------------
            da = fabs( atan2( (double) ( y3 - y2 ), (double) ( x3 - x2 ) ) -
                       atan2( (double) ( y2 - y1 ), (double) ( x2 - x1 ) ) );
            if( da >=M_PI )
                da = 2 * M_PI - da;

            if( da < bezier_angle_tolerance )
            {
                // Finally we can stop the recursion
                //----------------------
                add_segment( wxPoint( x123, y123 ) );
                return;
            }
        }
    }
    else
    {
        // Collinear case
        //------------------
        da = sqrt_len(dx, dy);
        if( da == 0 )
        {
            d = calc_sq_distance( x1, y1, x2, y2 );
        }
        else
        {
            d = ( (double)(x2 - x1) * dx + (double)(y2 - y1) * dy ) / da;
            if( d > 0 && d < 1 )
            {
                // Simple collinear case, 1---2---3
                // We can leave just two endpoints
                return;
            }
            if( d <= 0 )
                d = calc_sq_distance( x2, y2, x1, y1 );
            else if( d >= 1 )
                d = calc_sq_distance( x2, y2, x3, y3 );
            else
                d = calc_sq_distance( x2, y2, x1 + (int) d * dx,
                                      y1 + (int) d * dy );
        }
        if( d < bezier_distance_tolerance_square )
        {
            add_segment( wxPoint( x2, y2 ) );
            return;
        }
    }

    // Continue subdivision
    //----------------------
    recursive_bezier( x1, y1, x12, y12, x123, y123, level + 1 );
    recursive_bezier( x123, y123, x23, y23, x3, y3, -(level + 1) );
}
Exemplo n.º 14
0
void curve4_div::bezier(scalar x1, scalar y1, scalar x2, scalar y2, scalar x3, scalar y3, scalar x4, scalar y4)
{
    m_points.add(vertex_s(x1, y1));
    recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);
    m_points.add(vertex_s(x4, y4));
}
Exemplo n.º 15
0
//------------------------------------------------------------------------
void curve3_div::bezier(scalar x1, scalar y1, scalar x2, scalar y2, scalar x3, scalar y3)
{
    m_points.add(vertex_s(x1, y1));
    recursive_bezier(x1, y1, x2, y2, x3, y3, 0);
    m_points.add(vertex_s(x3, y3));
}