IPB
ЛогинПароль:

> Вершины пирамиды
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской
Реальное имя: Юра

Репутация: -  1  +


Доброе время суток всем. Проблемка такая: дано множество точек в пространстве. Каким образом можно проверить - будут ли эти точки являться вершинами пирамиды?

Добавлено через 4 мин.
понятно, что для существования пирамиды, необходимо, чтобы из n точек, n-1 лежало в одной плоскости, а одна точка была бы вне этой плоскости - но вот как выделить эту точку если такая существует?

Сообщение отредактировано: samec -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Вот, кладу. Учти две вещи:
1. Нужно дописать проверку на то, что 3 точки расположены по одной линии, и на то, что 4 точки лежат в одной плоскости (рыбы для функций есть).
2. Поскольку функций для проперки у меня не было, полноценное тестирование я провести не мог - могут быть ошибки.
const
n=8; // Number of points

type
tPoint= record
x,y,z: real
end;

var
a: array[1..n]of tPoint;

function Linear(i,j,k:integer):boolean;
begin
// Here, insert test for linearity of 3 points
end;

function Planar(i,j,k,l:integer):boolean;
begin
// Here, test for planarity of 4 points
end;

procedure Exchange(i,j:integer);
var
b: tPoint;
begin
b:=a[i];
a[i]:=a[j];
a[j]:=b
end;

var
i,i1,i2,i3,i4,i30,Pass,m: integer;

begin
Pass:=1;
repeat
i1:=1;
i2:=2;
i3:=3;
while (i3<=n) and (i3<>i1) and (i3<>i2) and Linear(i1,i2,i3) do Inc(i3);
if i3>n then begin
WriteLn('All points are in one line');
Exit
end;
if Pass=1 then begin
Exchange(3,i3);
i30:=i3;
i3:=3
end;
m:=0;
for i:=4 to n do if not Planar(i1,i2,i3,i) then begin
Inc(m);
i4:=i
end;
if m=0 then begin
WriteLn('All points are in one plane');
Exit
end
else if m=1 then begin
if Pass=2 then begin
Exchange(1,4);
Exchange(2,5);
Exchange(3,6);
if i4<=6 then Dec(i4,3)
end;
Exchange(i30,3);
if i4=i30 then i4:=3;
WriteLn('The top is #',i4)
end
else if Pass=2 then WriteLn('Not a piramid')
else begin
Exchange(1,4);
Exchange(2,5);
Exchange(3,6)
end;
Inc(Pass)
until Pass=3
end.


По поводу раздваивания: главное не расстраиваться smile.gif.
В старом разделе остается сслыка на эту тему. Я их оставляю, чтоб проще было найти в первое время. Потом удаляю (если не забываю smile.gif).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 20:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name