PavelK
@PavelK

Как повернуть уравнение плоскости относительно точки?

Добрый день.
Есть уравнение плоскости вида Ax+By+Cz+D=0
так же есть её базисы, если нужно,
есть некоторая точка M(x, y,z)
необходимо повернуть эм уравнение плоскости на угол Y U W (относительно осей ox, oy, oz)

Подскажите, пожалуйста, алгоритм.

P.S. Кватернионы не предлагать =)
Скорее всего мне помогут матрицы...
  • Вопрос задан
  • 4216 просмотров
Решения вопроса 3
gbg
@gbg
Любые ответы на любые вопросы
В этом уравнении A B C - координаты вектора нормали. Крутнуть нормаль можно путем обычного умножения на матрицу поворота.
Ответ написан
Комментировать
Mrrl
@Mrrl
Заводчик кардиганов
повернуть уравнение плоскости на угол Y U W (относительно осей ox, oy, oz)

- что имеется в виду? Повернуть плоскость на угол Y относительно ox, потом на U относительно oy, и потом на W относительно oz?
Предположим, что так.
Первым делом, надо сдвинуть систему координат так, чтобы точка M оказалась началом координат:
x=x1+MX, y=y1+MY, z=z1+MZ. Уравнение плоскости в этой системе будет A*x1+B*y1+C*z1+(D+A*MX+B*MY+C*MZ)=0.
Теперь выполним поворот относительно оси Ox: A1=A, B1=B*cos(Y)+C*sin(Y), C1=-B*sin(Y)+C*cos(Y). Свободный член в уравнении не изменится (расстояние до начала координат и длина вектора нормали не изменились), получилось уравнение A1*x+B1*y+C1*z+D1=0 (где D1=D+A*MX+B*MY+C*MZ). Аналогично выполняем повороты относительно Oy и Oz. Получится уравнение A3*x+B3*y+C3*z+D1=0. Осталось сдвинуть систему координат обратно, чтобы начало координат перешло в точку M: A3*x+B3*y+C3*z+(D1-A3*MX-B3*MY-C3*MZ)=0. Это есть ответ. Надо только убедиться, что повороты идут в правильные стороны.
Ответ написан
Комментировать
PavelK
@PavelK Автор вопроса
Спасибо всем! Я адцки затупил =)))
Если кому будет полезно, матрица поворота по всем осям сразу:
this.rotate = function(u,v,w)
{
var cu = Math.cos(u);
var su = Math.sin(u);
var cv = Math.cos(v);
var sv = Math.sin(v);
var cw = Math.cos(w);
var sw = Math.sin(w);

_a[0][0]= cu*cv; _a[1][0]= cu*sv*sw - su*cw; _a[2][0]= cu*sv*cw + su*sw;
_a[0][1]= su*cv; _a[1][1]= su*sv*sw + cu*cw; _a[2][1]= su*sv*cw - cu*sw;
_a[0][2]= -sv; _a[1][2]= cv*sw; _a[2][2]= cv*cw;

return this;
};

Что бы вращение шло вокруг точки, нужно сначала создать матрицу перемещения и умножить её на матрицу вращения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы