50453 (610132), страница 2
Текст из файла (страница 2)
Пункт2.Программа проверяет, лежат ли все данные точки в одной плоскости, если лежат-то решения нет, вершины пирамиды не будут найдены, а на дисплей выведется сообщение «точки лежат в одной плоскости».(переход к пункту 6)
Пункт3. Если все данные точки не лежат в одной плоскости, то программа берет N-1 точек (исключаемую точку принимая за возможную вершину пирамиды) и выполняет построение уравнения плоскости по 3-м точкам ,
Пункт4.Выполним проверку на принадлежность к данной плоскости оставшихся точек .В случае ,если хотя бы одна точка из оставшихся точек не принадлежит к плоскости, то переходим к пункту 6.
Пунтк5.Выполним проверку выпуклости многоугольника из полученной поверхности.( Проверка на выпуклость проверяется ,как условие сохранения знака векторного произведение смежных векторов). Если же проверка N-1 точек не даст того, что эти точки образуют плоскость, то из N точек будет взята другая точка и проведена еще проверка на выпуклость многоугольника. И так пока не будут перебраны все возможные точки.
В случае удачной проверки на выпуклость программа выдаст сообщение о том, что были определены вершины пирамиды с выпуклым основанием
Пункт6.вывод ответа
Описание структур данных
Для хранения точек был использован динамическая структура данных- односвязанный список. Элемент списка представляет собой запись с 2 полями:
-полем данных
-полем указателя на следующий элемент
В свою очередь поле данных представляет собой запись Coordinates с 3-я полями:x,y,z
Так же для работы со списком использовались дескрипторы ,которые представляли собой записи с 3-я полями
-start(указатель на начальный(фиктивный ) элемент)
-ptr(указатель на текущий элемент)
-Number(число элементов в записи)
Type
Coordinates=record {коориднаты}
x,y,z:real;
end;
P_Points=^point; {Описание типа Points}
point=record
data:Coordinates;
Next:P_Points;
end;
P_Descriptor=record {Дескриптор для работы со списком точек}
Start,Ptr:P_Points;
Number:Word;
end;
P_Vectors=^Vector; {Описание типа Vector}
Vector=record
data:Coordinates;
Next:P_Vectors;
end;
V_Descriptor=record {Дескриптор для работы со списком векторов}
V_Start,V_Ptr:P_Vectors;
V_Number:Word;
end;
Описание модуля
Спецификация подпрограмм для работы со списком
1.Спецификация процедуры InitListOfPoint;
1) Procedure InitListOfPoint(var P:P_Descriptor);;
-
Назначение: инициализирует фикивный элемент списка;
-
Входные параметры: P
-
Выходные параметры: P.
2.Спецификация процедуры PutPoint;
1) Procedure PutPoint(var P:P_Descriptor);
-
Назначение: создает элемент Buf и помещает его в список;
-
Входные параметры: P;
-
Выходные параметры: P;
3.Спецификация процедуры WritePoints;
1 Procedure WritePoints(var P:P_Descriptor);
-
Назначение: выводит весь список точек P на дисплей;
-
Входные параметры: P;
-
Выходные параметры: P.
4.Спецификация процедуры ReadPoint;
1) Procedure ReadPoint(var P:P_Descriptor;var a:Coordinates);
-
Назначение: cчитывает из списка P координаты точки в переменную а;
-
Входные параметры: P;
-
Выходные параметры: P,a.
5.Спецификация процедуры ClearMem;
1) Procedure ClearMem(var P:P_Descriptor;var V:V_Descriptor);
-
Назначение: освобождает выделенную память под списки P u V;
-
Входные параметры: P,V;
-
Выходные параметры: P,V.
Спецификация подпрограмм для работы с векторами
1.Спецификация процедуры CreateVector;
1) procedure CreateVector (a,b:Coordinates;var c:Coordinates);;
2) Назначение: создает вектор с вычитая соответствующие координаты точки b из точки a;
3)Входные параметры: a,b,c
4)Выходные параметры: c.
2.Спецификация процедуры MultOnNumber;
1) Procedure MultOnNumber (Number:real; a:Coordinates;var c:Coordinates)
2)Назначение: умножает вектор a на число real и полученное значение заносится в c вектор ;
3)Входные параметры: Number,a,c;
4)Выходные параметры: ,c;
3.Спецификация процедуры lengthOfVector;
-
Function lengthOfVector(a:Coordinates):real;
2Назначение: возвращает длину вектора а ;
3Входные параметры: а;
4Выходные параметры: -.
4.Спецификация процедуры Scalar;
1) Function Scalar(a,b:Coordinates):real;
2Назначение: возвращает результат скалярного перемножение векторов а и b ;
3Входные параметры: a,b;
4Выходные параметры: -.
5.Спецификация процедуры angle;
1) Function angle(a,b:coordinates):real
2Назначение: возвращает значение косинуса угла(в радианах)
между векторами а и b
3Входные параметры: a,b;
4Выходные параметры: -.
6.Спецификация процедуры VECTMult;
-
Procedure VECTMult(a,b:Coordinates;var c:Coordinates);
2Назначение: производит векторное перемножение вектора а и b и заносит результат в вектор с ;
3Входные параметры: а,b,c ;
4Выходные параметры: c.
7.Спецификация процедуры collinearity;
1) Function collinearity(a,b:Coordinates):boolean;
2Назначение: возвращает collinearity:=истина , если векторы а и b коллинеарные, иначе- collinearity:=ложь ;
3Входные параметры: a,b;
4Выходные параметры: -.
5 возврат : collinearity
9.Спецификация процедуры MixeMult;
1) Function MixeMult(a,b,c:Coordinates):real
2Назначение: возвращает MixeMult:= значение смешанного произведения векторов а и b
3Входные параметры: a,b;
4Выходные параметры: -.
5Возврат : MixeMult
10.Спецификация процедуры coplanarity;
1) Function coplanarity(a,b,c:Coordinates):boolean
2Назначение: возвращает coplanarity :=истина ,если векторы а,b и c компланарны,иначе- coplanarity :=ложь .
3Входные параметры: a,b,c;
4Выходные параметры: -.
Спецификация подпрограмм для определения вершин пирамиды
1.Спецификация процедуры ploskost
1) Procedure ploskost(a,b,c:coordinates;var ax,bx,cx,dx:real);;
-
Назначение: Строит по 3-м точкам уравнение плоскости вида Ax+By+Cz+D=0 и заносит в ax,bx,cx,dx соответствующие коэффициенты
-
Входные параметры:a,b,c,ax,bx,cx,dx;
-
Выходные параметры: ax,bx,cx,dx.
2.Спецификация функции proverka_na_ploskost;
1) function proverka_na_ploskost(var P:P_descriptor;var mno:mnoj; n:byte):boolean;;
-
Назначение: проверяет условие принадлежности n точек(указатели которых хранятся в множестве mno) к плоскости ,построенной с помощью процедуры ploskost,возращает значение истины в случае удачной проверки, иначе-ложь;
-
Входные параметры: P,mno,n;
-
Выходные параметры: P,mno.
-
Возврат : f
3.Спецификация функции Vypuklost;
1) Function Vypuklost(var P:P_descriptor;mno:mnoj;n:byte):boolean;;
-
Назначение: Проверяет многоугольник на выпуклость, путем перебора n точек из множества mno ,формированием их в векторы и последующим векторным перемножением . Возвращает значение истины, если при все N точках знак векторного умножения сохраняется, иначе -ложь;
-
Входные параметры: P,mno,n;
-
Выходные параметры: P.
-
Возврат : Q
4.Спецификация функции FinDaPyramid;
1) Procedure FinDaPyramid(var P:P_descriptor;mno:mnoj);
-
Назначение: определяет вершины пирамиды с выпуклым основанием и выводит на дисплей, если же нет решений -выводит соотсветсвующее сообщение ;
-
Входные параметры: P,mno,n;
-
Выходные параметры: P,mno.
Блок-схема
Заполняем множество mno индексами точек










I:=1


Исключаем i точку из множества mno


Выполняем проверку на выпуклость и результат присваиваем Fl
Возвращаем исключенную точку I в множество mno
Увеличиваем i



















Тестовые Данные
-Введем 5 точек
Точка 1(2,-1,-1)
Точка 2(1, 2, 3)
Точка 3(4, 1 1)
Точка 4(0, 1, 2)
Точка 5(7, 1, 1)
-Построим по 3-м точкам уравнение плоскости
Уравнение каждой плоскости имеет вид: Ax + By + Cz + D = 0. Так что наша задача по заданным координатам 3-ех точек плоскости найти коэффициенты A, B, C и D. Эти коэффициенты находятся по формулам:
где x, y, z - координаты наших точек, а 1-2-3 это номера точек A-B-C.
Соответственно находим эти коэффициенты и подставляем их в формулу
--В итоге, получаем уравнение вида Ax + By + Cz + D = 0.
A = -2
B = 10
C = -8
- D = -6
Подставим коэффициенты. Уравнение плоскости:
-2 x + 10 y - 8 z + 6 = 0
Далее, проверим 4 и 5 точку на принадлежность к этой плоскости:
Берем точку 4(0, 1, 2) и подставляем в уравнение -2 x + 10 y - 8 z + 6 = 0
-2(0)+10(1)-8(2)+6=0
0=0
Точка 4 принадлежит плоскости.
Берем точку 5(7, 1, 1) и подставляем в уравнение -2 x + 10 y - 8 z + 6 = 0
-2(7)+10(1)-8(1)+6=0
-6<>0
Точка 5 не лежит в плоскости.
-Далее проверим многоугольник на выпуклость.
Одним из критериев выпуклости является следующее. Многоугольник будет выпуклым, если для векторов, составляющих его периметр, выполняется условие: векторные произведение соседних векторов должны иметь одинаковый знак.
После последовательного выполнения векторного произведения, видим, что многоугольник выпуклый следовательно, данные 5 точек являются вершинами пирамиды с выпуклым основанием, вершины пирамиды:
(2,-1,-1)
(1, 2, 3)
(4, 1, 1)