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

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

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

> Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости, Помогите идеями
Рустам
сообщение 27.12.2009 15:38
Сообщение #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.


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

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

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


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

 



- Текстовая версия 20.07.2025 2:14
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"