Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости

Автор: Рустам 27.12.2009 19:38

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


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.


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

Автор: Lapp 27.12.2009 20:15

Первое, что бросается в глаза - ты неправильно трактуешь тип tochka.
Нужно делать так:

type
tTochka = record
x,y: integer
end;

Тогда массив точек будет такой:
var
Tochka: array[1..n]of tTochka;

Но это не принципиально.

Дальше, видно, что ты не внял моим словам ни про ClrScr, ни про Randomize - это, конечно, обидно..
И совету volvo ты тоже не внял - делай все через константы, не должно быть никаких чисел в пределах циклов и т.п.

Перебор в четырех циклах - в принципе верное решение.



Автор: Рустам 27.12.2009 20:29

Насчет рэндома и срт я внял, но эта ж прога как бы для себя.. мне так проще... Но как бы дело не в них..убрать их не долго... меня просто интересовал сам принцип решения. Является ли он правильным или есть какие то более легкие пути

Добавлено через 6 мин.
код немного подправил. убрал срт и добавил константу.

Автор: Lapp 27.12.2009 20:46

Цитата(Рустам @ 27.12.2009 16:29) *
эта ж прога как бы для себя.. мне так проще...

Наоборот - проще без них.
Я не удивлюсь, если какой-то слишком рьяный преподаватель потребует очистки экрана. Помни: все, что мы тут говорим, мы говорим именно для тебя, а не для кого-то. Именно ТЕБЕ так будет проще, поверь )). Ты только старайся вникнуть.

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

Автор: volvo 27.12.2009 20:52

Рустам, а теперь внимательно перечитай задание, и посмотри, что от тебя требовалось найти. И что будет распечатано в результате работы программы тоже посмотри...

Это первое. Второе - уже говорили, но я повторю еще раз: не хочешь проблем в дальнейшем - привыкай сразу инициализировать все переменные. Попробую сейчас найти ту тему, где автор жаловался, что пока все было в программе - работало, как только перенес в функцию - работать перестало. Именно по вышеуказанной причине...

Автор: Рустам 27.12.2009 21:28

Lapp, c типом для точек разобрался, но я пока оставлю как есть. для следующей программы обязательно учту.
volvo, дописал то, что необходимо найти и вывести.
Если я правильно понял тебя, то надо было мне в начале обнулить все переменные. (вроде ты сказал не рассчитывать на компилятор)
П.С. Стараюсь вникать в ваши советы... Не ругайтесь сильно

Автор: Lapp 27.12.2009 21:40

Цитата(Рустам @ 27.12.2009 17:28) *
Не ругайтесь сильно
А кто ругается? no1.gif