Beispiel #1
0
unsigned
NurbsTools::getClosestPoint (const ON_2dPoint &p, const ON_2dVector &dir, const vector_vec2d &data,
			     unsigned &idxcp)
{
  if (data.empty ())
    throw std::runtime_error ("[NurbsTools::getClosestPoint(2d)] Data empty.\n");

  unsigned idx (0);
  idxcp = 0;
  double dist2 (0.0);
  double dist2cp (DBL_MAX);
  for (unsigned i = 0; i < data.size (); i++)
  {
    ON_2dVector v = (data[i] - p);
    double d2 = ON_DotProduct(v, v);

    if (d2 < dist2cp)
    {
      idxcp = i;
      dist2cp = d2;
    }

    if (NEAR_ZERO(d2, SMALL_FASTF))
      return i;

    v.Unitize();

    double d1 = ON_DotProduct(dir, v);
    if (d1 / d2 > dist2)
    {
      idx = i;
      dist2 = d1 / d2;
    }
  }
  return idx;
}