Ограничительные рамки для круга и дуг в 3D - PullRequest
5 голосов
/ 07 апреля 2010

Для кривых типа Circle и Circular-Arc в трехмерном пространстве, каков хороший способ вычисления точных ограничивающих рамок (выровненных по мировой оси)?


Редактировать: найдено решение для кругов, все еще нужна помощь с дугами.

C # фрагмент для решения BoundingBoxes для кругов:

public static BoundingBox CircleBBox(Circle circle)
{
  Point3d O = circle.Center;
  Vector3d N = circle.Normal;

  double ax = Angle(N, new Vector3d(1,0,0));
  double ay = Angle(N, new Vector3d(0,1,0));
  double az = Angle(N, new Vector3d(0,0,1));

  Vector3d R = new Vector3d(Math.Sin(ax), Math.Sin(ay), Math.Sin(az));
  R *= circle.Radius;

  return new BoundingBox(O - R, O + R);
}

private static double Angle(Vector3d A, Vector3d B)
{
  double dP = A * B;
  if (dP <= -1.0) { return Math.PI; }
  if (dP >= +1.0) { return 0.0; }

  return Math.Acos(dP);
}

1 Ответ

4 голосов
/ 12 апреля 2010

Одна вещь, которая не указана, это как вы конвертируете этот диапазон углов в точки в пространстве. Итак, мы начнем с этого и предположим, что угол 0 отображается на O + r *** X **, а угол & pi; / 2 отображается на O + r *** Y **, где O - центр круга и X = (x 1 , x 2 , x 3 ) а также Г = (у 1 , у 2 , у 3 ) являются единичными векторами.

Таким образом, круг выделяется функцией

P (& theta;) = O + r cos (& theta;) X + r sin (& theta;) Y где & тета; находится в закрытом интервале [& theta; начало , & theta; конец ].

Производная P равна

P '(& theta;) = -r sin (& theta;) X + r cos (& theta;) Y

В целях вычисления ограничивающего прямоугольника нас интересуют точки, в которых одна из координат достигает экстремального значения, а следовательно, и точки, в которых одна из координат P 'равна нулю.

Установка -r sin (& theta;) x i + r cos (& theta;) y i = 0 мы получаем tan (& theta;) = грех (& theta;) / cos (& theta;) = y i / x i .

Итак, мы ищем & theta; где & тета; = arctan (y i / x i ) для i в {1,2,3}.

Вы должны следить за деталями диапазона arctan (), избегая деления на ноль, и если if & theta; это решение, то же самое можно сказать о & theta; & plusmn; k * & pi; и я оставлю эти детали вам.

Все, что вам нужно сделать, это найти набор & theta; соответствующие экстремальным значениям в вашем диапазоне углов, и вычислите ограничивающую рамку их соответствующих точек на окружности, и все готово. Возможно, что в диапазоне углов нет экстремальных значений, и в этом случае вы вычисляете ограничивающую рамку для точек, соответствующих & theta; start и & theta; end . Фактически, вы также можете инициализировать набор решений & theta ;, используя эти два значения, так что вам не нужно его использовать в особых случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...