Проекция многоугольника на плоскость с использованием GSL в C / C ++ - PullRequest
1 голос
/ 01 августа 2010

Общая проблема проецирования многоугольника на плоскость широко решена, но мне было интересно, кто-нибудь мог бы сделать некоторые предложения для моего конкретного случая.

У меня есть плоский многоугольник P в 3-пространстве, и яхотел бы проецировать его на плоскость через начало координат, ортогональное единичному вектору u.Вершины P и координаты u - единственные данные, которые у меня есть (все по стандартному базису R ^ 3).

Однако я не просто хочу, чтобы спроецированные координаты.Я действительно хотел бы найти ортонормированный базис плоскости, ортогональной к u, и затем найти координаты спроецированных вершин в этом новом базисе.

Сам базис не имеет значения, пока он ортонормирован.Поэтому на самом деле мне нужно сделать две вещи в рамках научной библиотеки GNU:

(1) Найти два ортонормированных базисных вектора для однородной плоскости, ортогональной единичному вектору u.

(2) Найдите координаты в этой основе проекции вершин P. на плоскость.

Есть идеи, как это сделать, используя gsl?

Ответы [ 3 ]

2 голосов
/ 01 августа 2010

Я не использовал GSL, но вам нужно только использовать точечный продукт, перекрестный продукт и нормализацию, чтобы получить результат.

(1) Выберите любой вектор r , который не кратен u . Пусть v = нормализованное перекрестное произведение r и u . Пусть w = перекрестное произведение u и v . Ваши ортонормированные базисные векторы: v и w .

(2) Чтобы спроецировать вершину a на эту плоскость, это ( a точка v ) * v + ( a точка ш ) * ш . (Координата v равна a точка v , координата w равна a точка w * 1 050 *) * * тысяча пятьдесят один Чтобы понять, как это работает, выберите u = <1,0,0> и r = <3,0,5> для запуска и визуализируйте 3 -д векторы.

1 голос
/ 03 августа 2010

Чтобы вычислить векторы v и w так, чтобы u, v, w были ортонормированным базисом:

void    make_basis3( const double* u, double* v, double* w)
{  double   h[3];
double  d;
double  s = ( u[0] > 0.0) ? 1.0 : -1.0;
double  f = s/(s+u[0]);
h[0] = u[0]+s;  h[1] = u[1]; h[2] = u[2];
d = f*h[1]; v[0] = -d*h[0]; v[1] = 1.0-d*h[1]; v[2] = -d*h[2];
d = f*h[2]; w[0] = -d*h[0]; w[1] = -d*h[1]; w[2] = 1.0-d*h[2];
}

Здесь предполагается, что длина u равна 1.

Что здесь происходитв том, что первые несколько строк вычисляют вектор h так, что матрица домохозяев, основанная на h (то есть Q = I - 2 * h * h '/ h' * h, где 'является транспонированной), отображает u в (+ -1,0,0) и две последние строки применяют эту матрицу к (0,1,0) для получения v и к (0,0,1) для получения w.Поскольку Q ортогональна и симметрична, u, v, w - ортонормированный базис.

Я думаю, что этот метод предпочтительнее использования перекрестных продуктов, потому что: он короче, он более эффективен, он менее подвержен ошибкам округления иобобщается на более высокие измерения.

Если P - точка, Pv и Pu - координаты P, спроецированные на плоскость, ортогональную к u через начало координат.

1 голос
/ 01 августа 2010

В вопросе отсутствует одна часть информации, а именно направление одного из базисных векторов.В вопросе говорится, что базисные векторы должны быть ортонормированными (т. Е. Иметь единичную длину и перпендикулярно друг другу) и, конечно, перпендикулярно u (поскольку они находятся в плоскости, перпендикулярной u), но это все же оставляет их свободными для вращения вокруг u на любой угол..

...