Смекни!
smekni.com

Создание программы для определения вершин пирамиды с выпуклым основанием по данным точкам (стр. 3 из 3)

Соответственно находим эти коэффициенты и подставляем их в формулу

--В итоге, получаем уравнение вида 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)

(0, 1, 2)

(7, 1, 1)

(интерфейс программы)

(ввод точек)

(вычисление вершин пирамиды с выпуклым основанием и вывод их на дисплей)



Заключение

пирамида вершина подпрограмма вектор

В курсовом проекте было предусмотрено следующее:

• создание библиотеки для работы с векторами в пространстве ;

• определение вершин пирамиды в с выпуклым основанием;

Список используемой литературы

1) Брусенцева В.С. Конспект лекций по программированию

2) ФароновВ. С. Turbo Pascal. Начальный курс. Учебное пособие. - М.: Нолидж»,1998 – 616 с.

3) Привалов И.И .Аналитическая геометрия. Учебник издательство «Лань» -304с .

4) Соболь Б.В. Практикум по высшей математике. издательство Ростов. 2006-640с


Приложение

Текст программ

Модуль MyUnit;

Unit MyUnitVector;

interface

Const {константы ошибок}

ListOk=0;

ListNotMem=1;

ListUnder=2;

ListEnd=3;

Type

mnoj=set of byte;

{Определение типов}

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;

Var

ListError:0..3; mno:mnoj;

{подпрограммы для формирования списка хранения и обработки списка векторов}

Procedure InitListOfVectors(var V:V_Descriptor);

Procedure PutVector(var V:V_Descriptor;c:Coordinates);

procedure CreateVector (a,b:Coordinates;var c:Coordinates);

Procedure WriteVectors(var V:V_Descriptor);

Procedure BeginOfVectors(var V:V_Descriptor);

{Подрограммы для работы с векторами}

Procedure AdditionVectors(a,b:Coordinates;var c:Coordinates);

Procedure MultOnNumber (Number:real; a:Coordinates;var c:Coordinates);

Function lengthOfVector(a:Coordinates):real;

Function Scalar(a,b:Coordinates):real;

Function angle(a,b:coordinates):real;

Function projection(a,b:coordinates):real;

Procedure VECTMult(a,b:Coordinates;var c:Coordinates);

Function collinearity(a,b:Coordinates):boolean;

Function MixeMult(a,b,c:Coordinates):real;

Function coplanarity(a,b,c:Coordinates):boolean;

{Подпрограммы для нахождения пирамиды в пространстве}

Procedure FinDaPyramid(var P:P_descriptor;mno:mnoj);

Procedure ploskost(var P:P_descriptor;a,b,c:coordinates;var ax,bx,cx,dx:real);

function proverka_na_ploskost(var P:P_descriptor;var mno:mnoj; n:byte):boolean;

Function Vypuklost(var P:P_descriptor;mno:mnoj;n:byte):boolean;

function Sign(T:real):byte;

{подпрограмм для формирования списка хранения и обработки точек}

Procedure InitListOfPoint(var P:P_Descriptor);

Procedure PutPoint(var P:P_Descriptor);

Procedure WritePoints(var P:P_Descriptor);

Procedure BeginOfPoints(var P:P_Descriptor);

Procedure ReadPoint(var P:P_Descriptor;var a:Coordinates);

Procedure MovePtrOfPoints(var P:P_Descriptor);

Procedure MoveToPoints(var P:P_Descriptor; n:word);

Procedure ClearMem(var P:P_Descriptor;var V:V_Descriptor);

Implementation

Procedure InitListOfVectors;

Begin

If MaxAvail<sizeOf(Vector) Then

ListError:=ListNotMem

else

begin

ListError:=ListOk;

V.V_Number:=0;

New(V.V_start);

V.V_Ptr:=V.V_Start;

end;

End;

Procedure PutVector;

var buf:P_Vectors;

Begin

If MaxAvail<sizeOf(Vector) Then

ListError:=ListNotMem

else

begin

ListError:=ListOk;

V.V_Ptr:=V.V_start;

New(Buf);

buf^.data:=c;

buf^.next:=V.V_Ptr^.next;

V.V_Ptr^.next:=buf;

V.V_Number:=V.V_number+1;

end;

end;

procedure createVector;

begin

with c do

begin

x:=a.x-b.x;

y:=a.y-b.y;

z:=a.z-b.z;

end;

end;

Procedure WriteVectors;

var index:word;

begin

If V.V_Number=0 then

ListError:=ListUnder

else

index:=1;

beginOfVectors(V);

while (V.V_Ptr^.next<>V.V_Start)and(index<=V.V_number) do

begin

writeln('Vector ',index,'= (',V.V_Ptr^.data.x:5:2,' , ',V.V_Ptr^.data.y:5:2,', ',V.V_Ptr^.data.z:5:2,') ');

V.V_Ptr:=V.V_Ptr^.next;

inc(index);

end;

end;

Procedure BeginOfVectors;

begin

V.V_Ptr:=V.V_start^.next;

end;

{Процедуры на свойства векторов}

Procedure AdditionVectors;

begin

with c do

begin

x:=a.x+b.x;

y:=a.y+b.y;

z:=a.z+b.z;

end;

end;

Procedure MultOnNumber;

begin

with c do

begin

x:=number*a.x;

y:=number*a.y;

z:=number*a.z;

end;

end;

Function lengthOfVector;

begin

lengthOfVector:=sqrt(sqr(a.x)+sqr(a.y)+sqr(a.z));

end;

Function Scalar;

begin

Scalar:=a.x*b.x+a.y*b.y+a.z*b.z;

end;

Function angle;

begin

Angle:= arccos(scalar(a,b))/(lengthOf Vector(a)*lengthOfVector(b));

end;

Function projection;

begin

projection:=(lengthOfVector(a)*lengthOfVector(b)*angle(a,b));

end;

Procedure VECTMult;

begin

with c do

begin

x:=a.y*b.z-b.y*a.z;

y:=a.z*b.x-b.z*a.z;

z:=a.x*b.y-b.x*a.y;

end;

end;

Function collinearity;

begin

if ((a.x/b.x)=(a.y/b.y))and((a.y/b.y)=(a.z/b.z)) then

collinearity:=true

else

collinearity:=false;

end;

Function MixeMult;


begin

MixeMult:=a.x*b.y*c.z+a.y*b.z*a.x+a.z*b.x*c.z-a.z*b.y*c.x-a.y*b.x*c.z-a.x*b.z*c.y;

end;

Function coplanarity;

begin

if MixeMult(a,b,c)=0 then

coplanarity:=true

else

coplanarity:=false; end;

{Подпрограммы для нахождения пирамиды}

Procedureploskost;

var

j:word;

Begin

Ax:=(1*b.y*c.z)+(1*c.y*a.z)+(a.y*b.z*1)-(a.z*b.y*1)-(1*a.y*c.z)-(c.y*b.z*1);

Bx:=(a.x*1*c.z)+(1*b.z*c.x)+(b.x*1*a.z)-(a.z*1*c.x)-(b.x*1*c.z)-(1*b.z*a.x);

Cx:=(a.x*b.y*1)+(b.x*c.y*1)+(a.y*1*c.x)-(1*b.y*c.x)-(c.y*1*a.x)-(b.x*a.y*1);

Dx:=-((a.x*b.y*c.z)+(b.x*c.y*a.z)+(a.y*b.z*c.x)-(c.y*b.z*a.x)-(a.z*b.y*c.x)-(b.x*a.y*c.z));

if (ax=0)and(bx=0)and(cx=0) then

writeln('lejat na odnoi pr9mou');


end;

Procedure FindaPyramid;

var

i,k:word;

f,fl:boolean;

a:coordinates;

begin

mno:=[];

for i:=1 to p.number do

mno:=mno+[i];

f:=proverka_na_ploskost(p,mno,p.number);

if f then writeln('resheni9 net..vse to4ki lejat v ploskosti')

else

begin

i:=1;

fl:=false;

while (not fl)and(i<=p.number) do

begin

mno:=mno-[i];

writeln;

if proverka_na_ploskost(p,mno,p.number-1) then

fl:=Vypuklost(p,mno,p.number-1)

else

fl:=false;

mno:=mno+[i];

i:=i+1;

end;

if fl then

begin

writeln('pyramida''s top are= ');

for i:=1 to p.number do

begin

movetopoints(p,i);

readpoint(p,a);

Writeln('( ',a.x:6:2,' ',a.y:6:2,' ',a.z:6:2,') ');

end;

end

else writeln('pyramida is not found ');

end;

end;

function proverka_na_ploskost;

var

ax,bx,cx,dx:real;

i:word;

a,t1,t2,t3:coordinates;

f:boolean;

begin

i:=1;

while not( i in mno) do i:=i+1;

movetopoints(p,i);

readpoint(p,t1);

i:=i+1;

while not( i in mno) do i:=i+1;

movetopoints(p,i);

readpoint(p,t2);

i:=i+1;

while not( i in mno) do i:=i+1;

movetopoints(p,i);

readpoint(p,t3);

ploskost(p,t1,t2,t3,ax,bx,cx,dx);

f:=true;

while (i<=n)and f do

begin

i:=i+1;

while not( i in mno) do i:=i+1;

movetopoints(p,i);

readpoint(p,a);

if ax*a.x+bx*a.y+cx*a.z+dx=0 then

begin

f:=true;

end

else

begin

f:=false;

end;

end;

proverka_na_ploskost:=f;

end;

Function Vypuklost;

var

i,j,k:byte;

Q:boolean;

T,Z,Px:real;

a,b,v1,v2:coordinates;

begin

i:=1;

while not( i in mno) do i:=i+1;

movetopoints(p,i);

readpoint(p,a);

k:=0;

while (k<>n) do

begin

if (i in mno) then inc(k);

inc(i);

end;

movetopoints(p,i);

readpoint(p,b);

inc(i);

createVector(a,b,V1);

createVector(a,b,V2);

T:=(v1.y*v2.z-v2.y*v1.z)-(v1.x*v2.z-v2.y*v1.z)+(v1.x*v2.y-v2.x*v1.y);

Z:=Sign(T);

Px:=1.0;

j:=1;

Q:=true;

While (Q and (j<n))do

begin

while not( j in mno) do j:=j+1;

movetopoints(p,j);

readpoint(p,a);

inc(j);

while not( j in mno) do j:=j+1;

movetopoints(p,j);

readpoint(p,b);

createVector(a,b,V1);

createVector(a,b,V2);

T:=(v1.y*v2.z-v2.y*v1.z)-(v1.x*v2.z-v2.y*v1.z)+(v1.x*v2.y-v2.x*v1.y);

Px:=Px*Z*Sign(T);

if (Px<0) then Q:=false;

inc(i);

end;

Vypuklost:=Q;

end;

function Sign;

begin

if t=0 then

Sign:=1

else

sign:=round(t/abs(t));

end;

{Подпрограммы для обрабоки списка точек}

Procedure InitListOfPoint;

Begin

If MaxAvail<sizeOf(point) Then

ListError:=ListNotMem

else

begin

ListError:=ListOk;

P.Number:=0;

New(P.start);

P.Ptr:=P.Start;

end;

End;

Procedure PutPoint;

var buf:P_Points;

Begin

If MaxAvail<sizeOf(point) Then

ListError:=ListNotMem

else

begin

ListError:=ListOk;

P.ptr:=P.start;

New(Buf);

write('Input point = ');

readln(buf^.data.x,buf^.data.y,buf^.data.z);

buf^.next:=P.Ptr^.next;

P.Ptr^.next:=buf;

P.Number:=P.number+1;

end;

end;

Procedure WritePoints;

var index:word;

begin

If P.Number=0 then

ListError:=ListUnder

else

index:=1;

beginOfPoints(P);

while (P.Ptr^.next<>P.Start)and(index<=P.number) do

begin

writeln('point ',index,'= (',P.Ptr^.data.x:5:2,' , ',P.Ptr^.data.y:5:2,', ',P.Ptr^.data.z:5:2,') ');

P.Ptr:=P.Ptr^.next;

inc(index);

end;

end;

Procedure BeginOfPoints;

begin

P.Ptr:=P.start^.next;

end;

Procedure ReadPoint;

begin

if P.Number=0 then

ListError:=ListUnder

else

begin

ListError:=ListOk;

a:=P.Ptr^.data;

end;

end;

procedure MovePtrOfPoints;

begin

P.Ptr:=P.Ptr^.next;

end;

Procedure MoveToPoints;

var i:word;

begin

IF n>P.Number then

ListError:=ListUnder

else

begin

ListError:=ListOk;

P.Ptr:=P.start;

i:=0;

While i<n do

begin

P.Ptr:=P.Ptr^.next;

i:=i+1;

end;

end;

end;

Procedure ClearMem;

var

P_i,P_j:P_Points;

V_i,V_j:P_Vectors;

Begin

P_i:=P.start^.next;

V_i:=V.V_start^.next;

dispose(P.start);

dispose(V.V_start);

While (P.Number<>0) do

begin

P.Number:=P.number-1;

P_j:=P_i;

P_i:=P_i^.next;

dispose(P_j);

end;

dispose(V_j);

end;

end;

end.

Текст основной программы

program FindPyramid;

uses MyUnitVector,crt;

var D_Vector:V_Descriptor;

D_point :P_Descriptor;

a,b,c:Coordinates;

ch:char;

sum,sum2:real;

n1,n2:word;

begin

clrscr;

initlistOfPoint(D_point);

InitListOfVectors(D_vector);

repeat

writeln('This programm will perform a task,which find a pyramid ');

writeln;

writeln('please, enter "1" if you want to add point');

writeln('please, enter "2" if you want to display all points');

writeln('please, enter "3" if you want to find pyramid');

writeln('please, enter "0" if you want to exit');

ch:=readkey;

Case ch of

#49 : PutPoint(D_point);

#50 : begin

WritePoints(D_point);

readkey;

end;

#51 : begin

FinDaPyramid(D_point,mno);

readkey;

end;

end;

c lrscr;

until ch=#48;

clearmem(D_point,D_vector);

writeln('Error=',ListError);

readkey;

end.