Опубликован: 20.10.2007 | Уровень: специалист | Доступ: платный
Лекция 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}

Сабина Бахриддинова
Сабина Бахриддинова
Дмитрий Трефилов
Дмитрий Трефилов

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Олег Волков
Олег Волков
Россия, Балаково, МБОУ СОШ 19