Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы3 / KG3 / отчет / Лаба3_мой_отчет_новый.doc
Скачиваний:
64
Добавлен:
02.05.2014
Размер:
202 Кб
Скачать
☆

4.Описание реализации применяемых методов

1 шаг) Нахождение коэффициентов плоскости;

2 шаг) Проверяем направление плоскости;

3 шаг) Определяем чем является плоскость;

4 шаг) Определяем чем является прямая;

5 шаг) Нахождение точки пересечения

a) Если плоскость-это плоскость и прямая-это прямая, то:

Вычисляем значение параметра;

Находим точку пересечения;

b) Если плоскость-это плоскость и прямая-это точка, то:

Проверяем лежит ли прямая-точка на плоскости;

c) Если плоскость-это прямая и прямая-это прямая, то:

Определяем точку пересечения прямых;

d) Если плоскость-это прямая и прямая-это точка, то:

Проверяем принадлежит ли прямая-точка плоскости-прямой;

e) Если плоскость-это точка и прямая-это прямая, то:

Проверяем принадлежит ли плоскость-точка прямой-прямой;

f) Если плоскость-это точка и прямая-это точка, то:

Проверяем совпадает ли плоскость-точка с прямой-точкой;

6 шаг) Прорисовка с учетом видимости

Обозначения:

P1,P2,P3-Точки задающие плоскость;

A1,A2,A3-Точки задающие отрезок;

K-точка пересечения;

a,b,c,d-Коэффициенты плоскости(или [A]);

C-Точка наблюдения;

Функция “Скалярное_произведение()”;

Функция “Определитель()”-считает определитель матрицы;

Функция “Корень()”-вычисляет квадратный корень от числа;

Функция “Линия()”-проводит линию между двумя точками

Функция “Пунктирная_линия()”-проводит пунктирную линию между 2-мя точками

1 шаг) Нахождение коэффициентов плоскости

Нахождение коэффициентов плоскости()

{

a =(P1.y-P2.y)*(P1.z+P2.z)+(P2.y-P3.y)*(P2.z+P3.z)+(P3.y-P1.y)*(P3.z+P1.z);

b = (P1.z-P2.z)*(P1.x+P2.x)+(P2.z-P3.z)*(P2.x+P3.x)+(P3.z-P1.z)*(P3.x+P1.x);

c = (P1.x-P2.x)*(P1.y+P2.y)+(P2.x-P3.x)*(P2.y+P3.y)+(P3.x-P1.x)*(P3.y+P1.y);

d=-(a*P1.x+b*P1.y+c*P1.z); }

2 шаг) Проверяем направление плоскости

Проверка направления плоскости()

{

(Если Скалярное_произведение(С,[A]) <0 )

{

a=a*(-1);

b=b*(-1);

c=c*(-1);

d=d*(-1);

}

}

3 шаг)Определяем чем является плоскость

Проверка чем является плоскость()

{

Если ((P1.x-P2.x)==0)и(P1.x-P3.x)==0)и(P1.y-P2.y)==0)и(P1.y-P3.y)==0)и(P1.z- P2.z)==0)и(P1.z-P3.z)==0))

{ Возвращаем: “Плоскость-это точка”;

}

ur1=(P3.x-P1.x)*(P2.y-P1.y)-(P3.y-P1.y)*(P2.x-P1.x);

ur2=(P3.x-P1.x)*(P2.z-P1.z)-(P3.z-P1.z)*(P2.x-P1.x);

ur3=(P3.y-P1.y)*(P2.z-P1.z)-(P3.z-P1.z)*(P2.y-P1.y);

Если (ur1==0 и ur2==0 и ur3==0)

{

Возвращаем: ”Плоскость-это прямая”;

}

Иначе

{ Возвращаем: “Плоскость-это плоскость”;

}

}

4 шаг)Определяем чем является прямая

Проверка чем является прямая()

{

Если((A1.x-A2.x)==0)и(A1.y-A2.y)==0)и(A1.z-A2.z)==0))

{

Возвращаем: "Прямая-это точка";

}

Иначе

{

Возвращаем: "Прямая-это прямая";

}

}

5 шаг)Нахождение точки пересечения

a) Случай “Плоскость-это плоскость и Прямая-это прямая”:

Получение параметра t()

{

t=-(A1.x*a+A1.y*b+A1.z*c+d);

t=t/((A2.x-A1.x)*a+(A2.y-A1.y)*b+(A2.z-A1.z)*c);

}

Определение точки пересечения()

{

Если (Скалярное_призведение(A1,[A])<0 и Скалярное_призведение(A2,[A])>0) или (Скалярное_призведение(A1,[A])>0 и Скалярное_призведение(A2,[A])<0)

{

K.x=A1.x+t*(A2.x-A1.x);

K.y=A1.y+t*(A2.y-A1.y);

K.z=A1.z+t*(A2.z-A1.z);

Вывод сообщения(“Точка пересечения K имеет координаты (K.x,K.y,K.z)”);

}

Если (Скалярное_призведение(A2,[A])<>0 и Скалярное_призведение(A1,[A])==0)

{

K.x=A1.x;

K.y=A1.y

K.z=A1.z

Вывод сообщения(“Точка A1 лежит на плоскости: (K.x,K.y,K.z)”);

}

Если (Скалярное_призведение(A1,[A])<>0 и Скалярное_призведение(A2,[A])==0)

{

K.x=A2.x;

K.y=A2.y

K.z=A2.z

Вывод сообщения(“Точка A2 лежит на плоскости: (K.x,K.y,K.z)”);

}

}

b) Случай “Плоскость-это плоскость и Прямая-это точка”:

Если Скалярное_произведение(A1,[A])==0

{

K.x=A1.x;

K.y=A1.y;

K.z=A1.z;

Вывод сообщения(“Прямая-точка лежит на плоскости. Координаты: (K.x,K.y,K.z)”);

}

c) Случай “Плоскость-это прямая и Прямая-это прямая”:

Определение точки пересечения прямых()

{

Если (Определитель(главный) <>0)

{ K.x=Определитель(по X)/(Определитель(главный);

K.y=Определитель(по Y)/(Определитель(главный);

K.z=Определитель(по Z)/(Определитель(главный);

}

Иначе

{ Вывод сообщения(“Прямые параллельны или совпадают!”);

}

}

Проверка принадлежности точки пересечения отрезку A1A2 ()

{ l=Корень((A1.x-K.x)*(A1.x-K.x)+(A1.y-K.y)*(A1.y-K.y)+(A1.z-K.z)*(A1.z-K.z));

m=Корень((K.x-A2.x)*(K.x-A2.x)+(K.y-A2.y)*(K.y-A2.y)+(K.z-initA2.z)*(K.z-A2.z);

n=Корень((A1.x-A2.x)*(A1.x-A2.x)+(A1.y-A2.y)*(A1.y-A2.y)+(A1.z-A2.z)*(A1.z-A2.z);

Если (l+m==n)

{ Вывод сообщения(“Точка пересечения K имеет координаты (K.x,K.y,K.z)”);

}

Иначе

{ Вывод сообщения(“Точки пересечения нет!”)

}

}

d) Случай “Плоскость-это прямая и Прямая-это точка”:

ur1=(A1.x-F1.x)*(F2.y-F1.y)-(A1.y-F1.y)*(F2.x-F1.x);

ur2=(A1.x-F1.x)*(F2.z-F1.z)-(A1.z-F1.z)*(F2.x-F1.x);

ur3=(A1.y-F1.y)*(F2.z-F1.z)-(A1.z-F1.z)*(F2.y-F1.y);

, где F1 и F2 2 любые точки плоскости-прямой.

Если (ur1==0 и ur2==0 и ur3==0)

{

K.x=A1.x;

K.y=A1.y;

K.z=A1.z;

Вывод сообщения(“Прямая-точка лежит на плоскости-прямой. Координаты: (K.x,K.y,K.z)”);

}

e) Случай “Плоскость-это точка и Прямая-это прямая”:

l=Корень((A1.x-P1.x)*(A1.x- P1.x)+(A1.y- P1.y)*(A1.y- P1.y)+(A1.z- P1.z)*(A1.z- P1.z));

m=Корень((P1.x-A2.x)*(P1.x-A2.x)+(P1.y-A2.y)*(P1.y-A2.y)+(P1.z-initA2.z)*(P1.z-A2.z);

n=Корень((A1.x-A2.x)*(A1.x-A2.x)+(A1.y-A2.y)*(A1.y-A2.y)+(A1.z-A2.z)*(A1.z-A2.z);

Если (l+m==n)

{ K.x=A1.x;

K.y=A1.y;

K.z=A1.z;

Вывод сообщения(“Плоскость-точка на прямой. Координаты (K.x,K.y,K.z)”);

}

Иначе

{ Вывод сообщения(“Плоскость-точка не на прямой!”);

}

f) Случай “Плоскость-это точка и Прямая-это точка”:

Если (A1.x-P1.x==0 и A1.y-P1.y==0 и A1.z-P1.z==0)

{ K.x=A1.x;

K.y=A1.y;

K.z=A1.z;

Вывод сообщения(“Прямая-точка на плоскости-точке!”);

}

Иначе

{

Вывод сообщения(“Прямая-точка не на плоскости-точке!”);

}

6 шаг) Прорисовка с учетом видимости

Рассмотрим вопрос видимости для случая “Плоскость-это плоскость и Прямая-это прямая”. В остальных случаях прямая рисуется без учета видимости.

Плоскость является проецирующей()

{

Если (Скалярное_произведение(C,[A])==0)

{

Возвращаем: Плоскость является проецирующей;

}

Иначе

{

Возвращаем: Плоскость не является проецирующей;

}

}

Прорисовка прямой с учетом видимости()

{

Если (Скалярное_произведение(A1,[A])<0 и Скалярное_произведение(A2,[A])<0 и Плоскость не является проецирующей)

{

Пунктирная_линия(A1,A2);

Вывод сообщения(“Прямая находится за плоскостью!”);

}

Если (Скалярное_произведение(A1,[A])>0 и Скалярное_произведение(A2,[A])>0)

{

Линия(A1,A2);

Вывод сообщения(“Прямая находится перед плоскостью!”);

}

Если (Скалярное_произведение(A1,[A])>0 и Скалярное_произведение(A2,[A])<0 и Плоскость не является проецирующей)

{

Линия(A1,K);

Пунктирная_линия(K,A2);

Вывод сообщения(“Точка A1 перед плоскостью, A2 за плоскостью!”);

}

Если (Скалярное_произведение(A1,[A])<0 и Скалярное_произведение(A2,[A])>0 и Плоскость не является проецирующей)

{

Пунктирная_линия(A1,K);

Линия(K,A2);

Вывод сообщения(“Точка A2 перед плоскостью, A1 за плоскостью!”);

}

Если ((Скалярное_произведение(A1,[A])<0 и Скалярное_произведение(A2,[A])==0) или (Скалярное_произведение(A2,[A])<0 и Скалярное_произведение(A1,[A])==0)) и Плоскость не является проецирующей)

{

Пунктирная_линия(A1,A2);

Вывод сообщения(“Одна точка на плоскости, другая за плоскостью”);

}

Если ((Скалярное_произведение(A1,[A])>0 и Скалярное_произведение(A2,[A])==0)) или ((Скалярное_произведение(A2,[A])>0 и Скалярное_произведение(A1,[A])==0))

{

Линия(A1,A2);

Вывод сообщения(“Одна точка на плоскости, другая перед плоскостью”);

}

}