OpenSteer::AbstractVehicle* OpenSteer::OpenSteerDemo::findVehicleNearestScreenPosition (int x, int y) { // find the direction from the camera position to the given pixel const Vec3 direction = directionFromCameraToScreenPosition (x, y, glutGet (GLUT_WINDOW_HEIGHT)); // iterate over all vehicles to find the one whose center is nearest the // "eye-mouse" selection line float minDistance = FLT_MAX; // smallest distance found so far AbstractVehicle* nearest = NULL; // vehicle whose distance is smallest const AVGroup& vehicles = allVehiclesOfSelectedPlugIn(); for (AVIterator i = vehicles.begin(); i != vehicles.end(); i++) { // distance from this vehicle's center to the selection line: const float d = distanceFromLine ((**i).position(), camera.position(), direction); // if this vehicle-to-line distance is the smallest so far, // store it and this vehicle in the selection registers. if (d < minDistance) { minDistance = d; nearest = *i; } } return nearest; }
QPointF GraphicsUtils::calcConstraint(QPointF initial, QPointF current) { QList<PD *> pds; PD * pd = new PD; pd->p.setX(current.x()); pd->p.setY(initial.y()); pd->d = (current.y() - initial.y()) * (current.y() - initial.y()); pds.append(pd); pd = new PD; pd->p.setX(initial.x()); pd->p.setY(current.y()); pd->d = (current.x() - initial.x()) * (current.x() - initial.x()); pds.append(pd); double dx, dy, d; bool atEndpoint; QLineF plus45(initial.x() - 10000, initial.y() - 10000, initial.x() + 10000, initial.y() + 10000); distanceFromLine(current.x(), current.y(), plus45.p1().x(), plus45.p1().y(), plus45.p2().x(), plus45.p2().y(), dx, dy, d, atEndpoint); pd = new PD; pd->p.setX(dx); pd->p.setY(dy); pd->d = d; pds.append(pd); QLineF minus45(initial.x() + 10000, initial.y() - 10000, initial.x() - 10000, initial.y() + 10000); distanceFromLine(current.x(), current.y(), minus45.p1().x(), minus45.p1().y(), minus45.p2().x(), minus45.p2().y(), dx, dy, d, atEndpoint); pd = new PD; pd->p.setX(dx); pd->p.setY(dy); pd->d = d; pds.append(pd); qSort(pds.begin(), pds.end(), pdLessThan); QPointF result = pds[0]->p; foreach (PD* pd, pds) { delete pd; } return result; }
void pamd_spline3(tuple ** const tuples, int const cols, int const rows, int const depth, sample const maxval, pamd_point const p0, pamd_point const ctl, pamd_point const p1, pamd_drawproc drawProc, const void * const clientdata) { static unsigned int const splineThresh = 3; /* The limit of recursion */ if (distanceFromLine(ctl, p0, p1) <= splineThresh) { /* The control point is pretty close to the straight line that joins the endpoints, so we'll just draw a straight line. */ pamd_line( tuples, cols, rows, depth, maxval, p0, p1, drawProc, clientdata); } else { /* We want some curvature, so pick a point (b) sort of between the two endpoints and the control point and then draw a spline between each of the endpoints and (b): */ pamd_point const a = middlePoint(p0, ctl); pamd_point const c = middlePoint(ctl, p1); pamd_point const b = middlePoint(a, c); pamd_spline3( tuples, cols, rows, depth, maxval, p0, a, b, drawProc, clientdata); pamd_spline3( tuples, cols, rows, depth, maxval, b, c, p1, drawProc, clientdata); } }