- •Отчет по лабораторной работе №3
- •По дисциплине Компьютерная графика.
- •Содержание
- •1.Содержательная и формальная постановка задачи
- •2.Структура решения
- •3.Обзор и анализ методов решения
- •4.Описание реализации применяемых методов
- •6. Руководство пользователя
- •7. Результаты.
- •5. Описание программного обеспечения (руководство программиста)
- •Функциональная схема программы
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);
Вывод сообщения(“Одна точка на плоскости, другая перед плоскостью”);
}
}
