Отображение координат из плоскости, заданной вектором нормали, в плоскость XY - PullRequest
4 голосов
/ 08 января 2012

Итак, у меня есть этот алгоритм для вычисления поперечного сечения трехмерной фигуры с плоскостью, заданной с вектором нормали.

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

Это прекрасно работает, если нормаль к плоскости что-то вроде (0,0, c) - я просто копирую координаты x и y, отбрасывая z.

И вот мой вопрос: поскольку я понятия не имею, как преобразовать какую-либо другую равнину, кто-нибудь может подсказать мне, что мне теперь делать?

1 Ответ

7 голосов
/ 09 января 2012

Ваша панель определяется вектором нормалей

n=(xn,yn,zn)

Для преобразования координации нам нужны 2 базовых вектора и нулевая точка для панели

Базовые векторы

Мы выбрали те "естественно", которые подходят к панели x / y (см. Позже для случая края):

b1=(1,0,zb1)
b2=(0,1,zb2)

И мы хотим

b1 x b2 = n*c (c constскаляр)

чтобы убедиться, что эти два действительно являются основами

Теперь решите это:

b1 x b2= (0*zb2-zb1*1,zb1*0-1*zb2,1*1-0*0) = (zb1,zb2,1)
zb1*c=xn
zb2*c=yn
1*c=zn

c=zn,
zb2=yn/c=yn/zn
zb1=xn/c=xn/zn

b1=(1,0,yn/zn)
b2=(0,1,xn/zn)

и нормализуйте его

bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn))
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn))

Случайкогда zn = 0: в этом случае вектор нормали параллелен панели x / y, и естественные базовые векторы не существуют, в этом случае вы должны выбрать базовые векторы b1 и b2 с помощью эстетического POV и пройти то же решениепроцесс или просто выбрал BV1 и bv2.

1027 * Нулевая точка 1031 * вы говорили не точки привязки для вашей панели в OQ, но необходимо дифференцировать свою панель отбесконечное семейство параллельных панелей.

Если ваша точка привязки равна (0,0,0), это идеальноеchor point для преобразования координат, и ваша панель имеет

x*xn+y*yn+z*zn=0,
(y0,y0,z0)=(0,0,0)

Если нет, я предполагаю, что у вас есть точка привязки (xa, ya, za), а ваша панель имеет

x*xn+y*yn+z*zn=d

с константным скаляром.Естественной подгонкой будет точка панели, которая определяется нормальной проекцией исходной нулевой точки на панель:

P0=(x0,y0,z0)

с

(x0, y0, z0) = c * (xn,yn,zn)

Решение этой проблемы с

x*xn+y*yn+z*zn=d

дает

c*xn*xn+c*yn*yn+c*zn*zn=d

и

c=d/(xn*xn+yn*yn+zn*zn)

, таким образом

P0=(x0,y0,z0)=c*(xn,yn,zn)

найдено.

Finalпреобразование

достигается путем представления каждой точки вашей панели (то есть тех точек, которые вы хотите показать) как

P0+x'*bv1+y'*bv2

с x 'и y', являющимися новыми координатами.Поскольку мы знаем P0, bv1 и bv2, это довольно тривиально.Если мы не на грани, у нас есть нули в bv1.y и bv2.x, что еще больше уменьшает проблему.

x 'и y' - новые координаты, которые вы хотите.

...