Паскаль. Найти периметр многоугольника.

программирование Наука геометрия pascal паскаль

Найти периметр многоугольника(До 10 вводимых вершин).
---
program perimetr;
procedure delta(a,b,c,d:real; var x:real); {Процедура для подсчета расстояния между 2мя точками}
var buf:real;
begin
x:=sqrt(sqr(c-a)+sqr(d-b));
end;
var
a:array [1..10,1..3] of real;
n,i,j:integer; p,k:real;
begin
p:=0;
writeln('Vvedite kol-vo verchin(do 10)');
read(n);
for i:=1 to n do { ввод в массив, первый столбец - Х, второй столбец - У, третий столбец - расстояние между текущей и соседней точкой, которые будут рассчитаны позже}
begin
writeln('Vvedite koordinaty vershiny pod Nomerom ',i);
read(a[i,1]);
read(a[i,2]);
end;
for j:=1 to n-1 do {сортировка методом пузырька, спасибо пользователю ВиО}
for i:=1 to n-j do
if (a[i,1]<a[i+1,1]) and (a[i,2]<a[i+1,2]) then begin
k:=a[i,1]; a[i,1]:=a[i+1,1];a[i+1,1]:=k;
k:=a[i,2]; a[i,2]:=a[i+1,2];a[i+1,2]:=k;
end;
for i:=1 to n-1 do {расчет длины между точками}
begin
delta(a[i,1],a[i,2],a[i+1,1],a[i+1,2],a[i,3]);
end;
delta(a[n,1],a[n,2],a[1,1],a[1,2],a[n,3]); {расчет длины между первой и последней точкой}
for i:=1 to n do p:=p+a[i,3]; {суммирование длин}
writeln(p:6:4);
end.
----
Проблему сложно объяснить, но она заключается в сортировке. Сортирует методом пузырька, правильно, но оказывается, не так, как хотелось бы для решения задачи.
Возьмем 4 точки, т.е. квадрат (2;1),(2;3);(4;3);(4;1);
Если их ввести поочередно, то все верно и ответ равен 8.
Но если их(вершины) ввести хаотично, то должен бы сработать сортировщик. Сортировщик работает и расставляет легкие элементы выше тяжелых. В итоге, мы получаем такой порядок: (2;1),(2;3);(4;1);(4;3);
Т.е. последние 2 точки не стоят правильно из-за того, что я не проанализировал этот этап.
Не знаю, как настроить сортировщик так, чтобы он раскидал точки по ходу отрезков. Должно же быть А-В-С-D, а он выдает A-B-D-C. Еще нужно учесть, что вершин может быть 10 или меньше, т.е. фигура меняется и как найти к ним общий подход становится реальной проблемой. Кажется, что здесь массивом легко решить задачу не удастся. Или что-то придумывать для массива или надо другой подход к решению задачи предлагать.

Примечание:
Итак,задача из учебника.
---
Даны координаты вершин многоугольника (х1,y1,x2,y2,x10,y10). Определите его периметр. Вычисление расстояние delta между вершинами оформите подпрограммой. рассмотрите использование процедур и функций.
---
Мы оба варианта подпрограмм прошли, но мне лень сейчас вправлять процедуру в функцию.
Меня в задаче ввела в заблуждение строка "(х1,y1,x2,y2,x10,y10)", я понял, что там 10 точек, а строка "координаты вершин многоугольника" не уточняет конкретное количество вершин. Вот я и взялся за n=1..10. Честно, хотелось бы свой вариант с n - угольником организовать, т.к. если я буду знать, что для задачи нужен только подход к одному случаю, то задача не будет казаться сложной, хотя сейчас она мне даже слегка кажется невыполнимой :D

Примечание:
Я думаю, может, разделить фигуру на 4 равные части(сектора), т.е. квадраты?
http://linkme.ufanet.ru/images/ded07a934d408fe37ffe7717a8c6d123.jpg
И попытаться сложить каждый сектор отдельно и потом попытаться их соединить, не забыв про соединения на краях секторов. Еще бы подумать надо, как такое реализовать и будет ли это работать вообще. Я этим, пожалуй, займусь часов через 8-9.

Примечание:
Не. Вариант с разделением слишком громоздкий. Надо что-то придумать без разделения.
Ответы:
Я все программу не просматривал, но теперь понятно что вы неправильно применяете сортировку. Нужно либо вершины указывать последовательно, либо сортировать их не по мере увеличения координат (в таком порядке это просто набор точек), а по мере увеличения угла между их центром и горизонтальным направлением (это работает только для выпуклых многоугольников и для некоторых вогнутых).
Фраза "Даны координаты вершин многоугольника (х1,y1,x2,y2,x10,y10)" предполагает то что вершины перечисляются последовательно.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.