Пример #1
0
float qshape_create_tool_t::param_closest_to_point( qshape::shape_t *s, const Imath::V2f& p, float max_distance2) const
{
    float min_dist = max_distance2;
    float min_param = -1.0f;
    int min_span = 0, span = 0;

    for( qshape::shape_t::const_iterator it( s->begin()); it != s->end() - 1; ++it, ++span)
    {
	bezier::curve_t<Imath::V2f, 3> bez( it->p1(), it->p2(), ( it+1)->p0(), ( it+1)->p1());

        Imath::V2f q( IECore::closestPointInBox( p, bez.bounding_box()));
        float d = ( p - q).length2();

        if( d > min_dist)
	    continue;

	float t;

	q = bezier::nearest_point_on_curve( bez, p, t);
	d = ( p - q).length2();

	if( d < min_dist)
	{
	    min_dist = d;
	    min_param = t;
	    min_span = span;
	}
    }

    // the last segment
    ++span;
    qshape::shape_t::const_iterator it( s->end()-1);
    bezier::curve_t<Imath::V2f, 3> bez( it->p1(), it->p2(), s->begin()->p0(), s->begin()->p1());

    Imath::V2f q( IECore::closestPointInBox( p, bez.bounding_box()));
    float d = ( p - q).length2();

    if( d <= min_dist)
    {
	float t;

	Imath::V2f q = bezier::nearest_point_on_curve( bez, p, t);
	float d = ( p - q).length2();

	if( d < min_dist)
	{
	    min_dist = d;
	    min_param = t;
	    min_span = span;
	}
    }

    return min_param + min_span;
}
Пример #2
0
bool Path::PointInside(const Objects & objects, const Vec2 & pt, bool debug) const
{
	vector<Vec2> x_ints;
	vector<Vec2> y_ints;
	for (unsigned i = m_start; i <= m_end; ++i)
	{
		Bezier bez(objects.beziers[objects.data_indices[i]].ToAbsolute(objects.bounds[i]));
		vector<Vec2> xi(bez.SolveX(pt.x));
		vector<Vec2> yi(bez.SolveY(pt.y));
		x_ints.insert(x_ints.end(), xi.begin(), xi.end());
		y_ints.insert(y_ints.end(), yi.begin(), yi.end());
	}
	//Debug("Solved for intersections");
	unsigned bigger = 0;
	unsigned smaller = 0;
	for (unsigned i = 0; i < x_ints.size(); ++i)
	{
		if (debug)
				Debug("X Intersection %u at %f,%f vs %f,%f", i,Double(x_ints[i].x), Double(x_ints[i].y), Double(pt.x), Double(pt.y));
		if (x_ints[i].y >= pt.y)
		{
			
			++bigger;
		}
	}
	smaller = x_ints.size() - bigger;
	if (debug)
	{
		Debug("%u horizontal, %u bigger, %u smaller", x_ints.size(), bigger, smaller);
	}
	if (smaller % 2 == 0 || bigger % 2 == 0)
		return false;
		
	bigger = 0;
	smaller = 0;

	for (unsigned i = 0; i < y_ints.size(); ++i)
	{
		if (debug)
				Debug("Y Intersection %u at %f,%f vs %f,%f", i,Double(y_ints[i].x), Double(y_ints[i].y), Double(pt.x), Double(pt.y));
		if (y_ints[i].x >= pt.x)
		{
			
			++bigger;
		}
	}
	smaller = y_ints.size() - bigger;
	if (debug)
	{
		Debug("%u vertical, %u bigger, %u smaller", y_ints.size(), bigger, smaller);
	}
	if (smaller % 2 == 0 || bigger % 2 == 0)
		return false;
		
		
	return true;
}
void main()
{
	int n, x[10], y[10], i, gdriver = DETECT, gmode;
	clrscr();
	printf("\nEnter the number of control point: ");
	scanf("%d", &n);
	printf("\nEnter coordinates of the control points\n");
	for(i = 0; i < n; i++)
	{
		printf("\nCoordinates of point %d: " , i + 1);
		scanf("%d %d", &x[i], &y[i]);
	}
	initgraph(&gdriver, &gmode, "C:\\TurboC3\\BGI");
	bez(x, y, n);
	getch();
	closegraph();
}
Пример #4
0
void DrawCurves(QPainter *p,pigalePaint *paint)
  {GeometricGraph G(paint->GCP);
  Prop<Tpoint> Epoint1(G.Set(tedge()),PROP_DRAW_POINT_1);
  Prop<Tpoint> Epoint2(G.Set(tedge()),PROP_DRAW_POINT_2);
  Prop<Tpoint> Epoint3(G.Set(tedge()),PROP_DRAW_POINT_3);
  Prop<Tpoint> vcoord(G.Set(tvertex()),PROP_DRAW_POINT_1);
  Prop<short> ecolor(G.Set(tedge()),PROP_COLOR);
  Prop<short> vcolor(G.Set(tvertex()),PROP_COLOR);
  int m = G.ne(); 
  int n = G.nv(); 
  QPen pn = p->pen();pn.setWidth(2);
  QVector<QPoint>  bez(7);

  for (tedge ee=1; ee<=m; ee++)
    {if (Epoint2[ee]!=Tpoint(0,0)) {
       bez[0] = QPoint(paint->to_x(vcoord[G.vin[ee]].x()),paint->to_y(vcoord[G.vin[ee]].y()));
       bez[1] = QPoint(paint->to_x(Epoint1[ee].x()),paint->to_y(Epoint1[ee].y()));
       bez[2] = QPoint(paint->to_x(Epoint1[ee].x()),paint->to_y(Epoint1[ee].y()));
       bez[3] = QPoint(paint->to_x(Epoint2[ee].x()),paint->to_y(Epoint2[ee].y()));
       bez[4] = QPoint(paint->to_x(Epoint3[ee].x()),paint->to_y(Epoint3[ee].y()));
       bez[5] = QPoint(paint->to_x(Epoint3[ee].x()),paint->to_y(Epoint3[ee].y()));
       bez[6] = QPoint(paint->to_x(vcoord[G.vin[-ee]].x()),paint->to_y(vcoord[G.vin[-ee]].y()));
       QPainterPath path;
       path.moveTo(bez.at(0));
       path.cubicTo(bez.at(1),bez.at(2),bez.at(3));
       p->strokePath(path, p->pen());
       path.moveTo(bez.at(3));
       path.cubicTo(bez.at(4),bez.at(5),bez.at(6));
       p->strokePath(path, p->pen());
       //paint->DrawRect(p,Epoint1[ee],3,3,Red);
       //paint->DrawRect(p,Epoint3[ee],3,3,Red);
     }
    else
      paint->DrawSeg(p, vcoord[G.vin[ee]], vcoord[G.vin[-ee]] , ecolor[ee]);
      }
  // Draw the vertices
  p->setFont(QFont("sans",Min((int)(10*Min(paint->xscale,paint->yscale) + .5),13)));
  for(tvertex v = 1;v <= n;v++) 
      paint->DrawText(p,vcoord[v],v,vcolor[v],1);
  }