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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости, Помогите идеями
сообщение
Сообщение #1


Новичок
*

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

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


Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости
Вот что получилось сделать

const n=10;
var
tochka : record
x: array [1..n] of integer;
y: array [1..n] of integer;
end;

i,v1x,v2x,v1y,v2y: integer;
i1,i2,i3,i4: integer;
d1,d2,s,max,xt,yt: real;
maxx1, maxx2, maxx3, maxx4: real;
maxy1,maxy2,maxy3,maxy4: real;
begin

for i:=1 to n do
begin
tochka.x[i]:=random(20);
tochka.y[i]:=random(20);
write(tochka.x[i]:3,' ',tochka.y[i]:3,' ');
writeln;
end;

max:=0; maxx1:=0; maxx2:=0; maxx3:=0; maxx4:=0;
s:=0; maxy1:=0; maxy2:=0; maxy3:=0; maxy4:=0;
d1:=0; v1x:=0; v1y:=0; v2x:=0; v2y:=0;
d2:=0;
xt:=0;
yt:=0;


for i1:=1 to n-3 do {так как работа идет с 4 точками ничего умнее не придумал как сделать цикл}
for i2:=i1+1 to n-2 do {c четрьмя переменными}
for i3:=i2+1 to n-1 do
for i4:=i3+1 to n do
begin
v1x:=tochka.x[i2]-tochka.x[i1]; {из 4 точек делаем 2 вектора}
v1y:=tochka.y[i2]-tochka.y[i1];
v2x:=tochka.x[i4]-tochka.x[i3];
v2y:=tochka.y[i4]-tochka.y[i3];


if (v1x*v2x+v1y*v2y)=0 then {решил воспользоваться скалярным произведением для определения }
begin {угла между векторами то есть кос 90 = 0 }

xt:=(tochka.x[i2]+tochka.x[i1])/2; {значит сумма произведений соотв. координат дает ноль}
yt:=(tochka.y[i2]+tochka.y[i1])/2; {и я предполагаю если они пересекаются под 90 гр. и делятся точкой }
{пересечения пополам то нахожу эту точку}
if (tochka.x[i4]-xt=xt-tochka.x[i3]) and (tochka.y[i4]-yt=yt-tochka.y[i3]) {и проверяю делятся ли они пополам }
then {в этой точке}
begin
d1:=sqrt(sqr(v1x)+sqr(v1y)); {нахожу длину этих векторов - они же длины диагоналей}
d2:=sqrt(sqr(v2x)+sqr(v2y));
s:=d1*d2/2; {нахожу площадь сравниваю с максимальной}
if max<s then
begin
max:=s;
maxx1:=tochka.x[i1];
maxy1:=tochka.y[i1];
maxx2:=tochka.x[i2];
maxy2:=tochka.y[i2];
maxx3:=tochka.x[i3];
maxy3:=tochka.y[i3];
maxx4:=tochka.x[i4];
maxy4:=tochka.y[i4];
end;


end;
end;
end;


writeln(s);
write('Точки A B C D задающие ромб ',maxx1,' ',maxy1,' ',maxx2,' ',maxy2,' ',maxx3,' ',maxy3,' ',maxx4,' ',maxy4)

readln;
end.


Вот какие успехи , направильность не проверял, грубый какой то код получился. Может я где то ошибся или возможны способы решения задачи попроще?

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

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


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

 





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