Отображение координат из плоскости, заданной нормальным вектором, в плоскость XY

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

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

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

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


person stollgrin    schedule 08.01.2012    source источник
comment
Я подозреваю, что вы хотите сделать либо проекцию из одной панели (вашего поперечного сечения) на другую (x, y), либо преобразование координат из одной в другую - какую?   -  person Eugen Rieck    schedule 08.01.2012
comment
В настоящее время у меня есть набор трехмерных точек (x, y, z) (ну на самом деле (x, y, z, 1)) в трехмерной системе координат. Я хочу, чтобы набор двухмерных точек (x ', y') (ну, опять же, фактически (x ', y', 1)), таких как (x ', y') в плоскости XY совпадает (x, y, z ) в трехмерной плоскости, заданной вектором нормали. До сих пор я думал, что если бы я мог повернуть плоскость, заданную вектором, я мог бы просто спроецировать точки следующим образом: (x, y, z, 1) - ›(x, y, 1)   -  person stollgrin    schedule 08.01.2012
comment
@EugenRieck Привет, Юджин, что бы вы сказали, это разница между проекцией из одной панели (ваше поперечное сечение) на другую (x, y) или преобразованием координат из одного в другое   -  person user1084113    schedule 04.03.2013


Ответы (1)


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

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 с помощью эстетической точки зрения и пройти через тот же процесс решения или просто выбрал bv1 и bv2.

Нулевая точка

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

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

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

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

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

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

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)

находится.

Окончательное преобразование

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

P0+x'*bv1+y'*bv2

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

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

person Eugen Rieck    schedule 08.01.2012
comment
Очень красивое объяснение! Я столкнулся с той же проблемой и, чтобы выразить трехмерные точки на вычисленных базисных векторах, я спроецировал их на базисные векторы с помощью скалярного произведения. x' = pt3d.dot(bv1) y' = pt3d.dot(bv2) Это правильно? - person Dexter; 15.02.2012
comment
Привет, я думаю, здесь есть небольшая ошибка: b1=(1,0,yn/zn) b2=(0,1,xn/zn) На самом деле b1 * n ~ = 0, вы упускаете минус. b1=(1,0,-yn/zn) b2=(0,1,-xn/zn) - person tommy.qichang; 13.09.2017