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