Опубликован: 20.10.2007 | Доступ: свободный | Студентов: 3779 / 858 | Оценка: 4.38 / 3.99 | Длительность: 12:07:00
ISBN: 978-5-94774-654-9
Специальности: Программист
Лекция 3:

Геометрические преобразования

Уравнения прямой и плоскости

Уравнение прямой на плоскости в декартовой системе координат можно задать уравнением вида

y=kx+b
для случая, когда прямая не параллельна оси OY, и уравнением
x=c
для вертикальной прямой. Но прямая может быть также задана и другим способом. Достаточно указать вектор направления этой прямой \overrightarrow{l}=(l_x,l_y) и какую-нибудь точку \overrightarrow{r}_0=(x_0,y_0), лежащую на этой прямой. При этом точки, лежащие на прямой, могут быть заданы с использованием векторных операций в виде так называемого параметрического уравнения прямой
\overrightarrow{r}=\overrightarrow{r}_0+t\overrightarrow{l},
в котором параметр t пробегает все значения числовой прямой. Координаты точки, соответствующей некоторому значению этого параметра, определяются соотношениями
x=x_0+tl_x, \quad y=y_0+tl_y. ( 3.4)

Прямую в пространстве тоже можно задавать параметрическим уравнением, которое очень легко получить из предыдущего простым переходом от двумерных векторов к трехмерным. Пусть \overrightarrow{l}=(l_x,l_y,l_z), \; \overrightarrow{r}_0=(x_0,y_0,z_0). Тогда это уравнение будет определять прямую в пространстве, а координаты точек этой прямой будут определяться формулами

x=x_0+tl_x, \quad y=y_0+tl_y, \quad z=z_0+tl_z, \quad -\infty<t<+\infty. ( 3.5)

Как известно из элементарной геометрии, через любые три точки в пространстве проходит плоскость. С другой стороны, через каждую точку плоскости можно провести единственную прямую, перпендикулярную данной плоскости. При этом все эти прямые будут параллельны друг другу, а значит, они имеют общий вектор направления. Этот вектор будем называть нормалью к плоскости. Если длина вектора равна единице, мы будем называть его единичной нормалью. В компьютерной графике часто приходится решать задачу построения нормали к некоторой плоскости, заданной тремя точками, а также задачи пересечения прямой с плоскостью и двух плоскостей.

Плоскость в пространстве можно задать, указав вектор нормали к ней и какую-либо точку, принадлежащую данной плоскости. Пусть \overrightarrow{n}=(n_1,n_2,n_3) - вектор единичной нормали, а \overrightarrow{r}_0=(x_0,y_0,z_0) - некоторая точка на плоскости. Тогда для любой точки \overrightarrow{r}=(x,y,z), лежащей на плоскости, вектор \overrightarrow{r}-\overrightarrow{r}_0 будет ортогонален вектору нормали, а следовательно, выполняется равенство

\left(
(\overrightarrow{r}-\overrightarrow{r}_0)\cdot \overrightarrow{n}
\right)=0.
Раскрывая это выражение в координатном виде, получаем
n_1 x+n_2 y +n_3 z-n_1 x_0 -n_2 y_0 -n_3 z_0 =0.
Теперь перепишем это уравнение в виде
n_1 x+n_2 y+n_3 z+d=0, ( 3.6)
где d=-n_1 x_0-n_2 y_0-n_3 z_0. Это уравнение называется каноническим уравнением плоскости. При этом совершенно ясно, что если все это уравнение умножить на какой-либо отличный от нуля множитель, то оно будет описывать ту же самую плоскость, т.е. коэффициенты n_1, n_2, n_3 для каждой плоскости задаются с точностью до произвольного ненулевого множителя. Но если при этом вектор \overrightarrow{n} имеет единичную длину, то |d| задает расстояние от начала координат до данной плоскости.

В алгоритмах компьютерной графики довольно часто приходится сталкиваться с задачей построения плоскости, проходящей через три заданные точки. Пусть три точки \overrightarrow{r}_1, \overrightarrow{r}_2 и \overrightarrow{r}_3, не лежащие на одной прямой, имеют координатами (x_1,y_1,z_1),(x_2,y_2,z_2) и (x_3,y_3,z_3). Для канонического уравнения необходимо построить нормаль к плоскости, что легко можно осуществить, используя операцию векторного произведения. Поскольку векторы \overrightarrow{v}_1=\overrightarrow{r}_2-\overrightarrow{r}_1 и \overrightarrow{v}_2=\overrightarrow{r}_3-\overrightarrow{r}_1 лежат в искомой плоскости, то вектор \overrightarrow{N}=\overrightarrow{v}_1\times\overrightarrow{v}_2 будет ортогонален этой плоскости. Пусть \overrightarrow{N}=(N_x,N_y,N_z), тогда уравнение плоскости будет иметь вид

N_x x+N_y y+N_z z+D=0.

Остается определить значение D. Так как точка \overrightarrow{r}_1 принадлежит этой плоскости, то ее координаты должны удовлетворять полученному уравнению. Подставим их в уравнение и получим

N_x x_1+N_y y_1 +N_z z_1 +D=0,
следовательно
D=-N_x x_1-N_y y_1-N_z z_1,
и после подстановки окончательно получим:
N_x(x-x_1)+N_y(y-y_1)+N_z(z-z_1)=0 ( 3.7)

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

Пересечение луча с плоскостью и сферой

Прямая на плоскости и в пространстве является бесконечной в обе стороны. Лучом называется полупрямая, т.е. множество всех точек прямой, лежащих по одну сторону от заданной ее точки, называемой началом луча. Луч будем задавать в параметрическом виде, как это было описано в одном из предыдущих разделов. Пусть \overrightarrow{l}=(l_x,l_y,l_z) - направляющий вектор прямой, а \overrightarrow{r}_0=(x_0,y_0,z_0) - начальная точка. Тогда координаты точек луча будут определяться формулами

x=x_0+tl_x, \quad y=y_0+tl_y, \quad z=z_0+tl_z. ( 3.8)

Будем считать, что направляющий вектор единичный, т.е. l_x^2+l_y^2+l_z^2=1.

Сначала рассмотрим задачу о нахождении точки пересечения луча с плоскостью, заданной каноническими уравнением

n_1 x+n_2 y+n_3 z+d =0. ( 3.9)

Вектор нормали \overrightarrow{n}=(n_1,n_2,n_3) тоже будем считать единичным. Сначала надо определить значение параметра t, при котором луч пересекает плоскость. Для этого подставим координаты из формулы (3.8) в уравнение (3.9) и получим

n_1(x_0+tl_x)+n_2(y_0+tl_y)+n_3(z_0+tl_z)+d=0,
откуда легко определить, что луч пересекает плоскость в точке со значением
t_0=-\frac{(\overrightarrow{r}_0\cdot\overrightarrow{n})+d}{(\overrightarrow{l}\cdot\overrightarrow{n})}.

Очевидно, что такая точка существует только при условии (\overrightarrow{l}\cdot\overrightarrow{n})\neq0. В свою очередь, эта величина обращается в нуль только в случае, когда векторы \overrightarrow{l} и \overrightarrow{n} ортогональны друг другу.

Пусть теперь нам задана сфера с центром в точке \overrightarrow{r}_c=(x_c,y_c,z_c) и радиусом d. Тогда уравнение сферы будет иметь вид

(x-x_c)^2+(y-y_c)^2+(z-z_c)^2=d^2.

Подставив сюда координаты луча из уравнения (3.8), получим, что параметр, при котором луч пересекает сферу, должен удовлетворять квадратному уравнению

at_0^2+bt_0+c=0,
где a=|\overrightarrow{r}_c|^2, \; b=2((\overrightarrow{r}_0-\overrightarrow{r}_c)\cdot\overrightarrow{l}), \; c=|\overrightarrow{r}_0-\overrightarrow{r}_c|^2-d^2. Определим корни этого уравнения. Если дискриминант D=\frac{b^2}{4}-c\ge 0, то корни существуют. Их может быть либо два (D>0), либо один (D=0). В первом случае имеем две точки пересечения, во втором - одну (луч касается сферы). Соответствующие значения параметра определяются соотношением
t_{1,2}=-\frac{b}{2}\mp\sqrt{D}

Дмитрий Трефилов
Дмитрий Трефилов

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Виталий Аверьянов
Виталий Аверьянов
Россия, Самарская область