Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2006, 21:45   #11
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

ну во-первых он просил алгоритм, а во-вторых его надо искать. если найду - завтра обязятельно кину.
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 02.12.2006, 08:25   #12
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

но не совсем честное, с точки зрения математики
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 07.12.2006, 19:12   #13
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Как и обещал выкладываю исходник той проги. Пусть с небольшим опозданием, но лучше поздно, чем никогда. Решение написано на Turbo Pascal и поэтому считается абсолютно частным с точки зрения математики, да и других наук тоже. Тока она работает с треугольником. Но любой многоугольник можно разбить на треугольники. Это отличная разминка для мозга.
Код:
var ax,bx,cx,dx,ay,by,cy,dy:real;
    per1,per2:real;

procedure Zapoln;
begin
write('Koordinaty A  ');
readln(ax, ay);
write('Koordinaty B  ');
readln(bx, by);
write('Koordinaty C  ');
readln(cx, cy);
write('Koordinaty D  ');
readln(dx, dy);
end;

procedure Perim(n:integer);
var d1,d2,d3,per:real;
begin
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy));
per:=(d1+d2+d3)/2;
per:=sqrt(per*(per-d1)*(per-d2)*(per-d3));
if n=1 then per1:=per else per2:=per;
end;

procedure Zamena;
var d1,d2,d3:real;
begin
d1:=sqrt((ax-dx)*(ax-dx)+(ay-dy)*(ay-dy));
d2:=sqrt((dx-bx)*(dx-bx)+(dy-by)*(dy-by));
d3:=sqrt((dx-cx)*(dx-cx)+(dy-cy)*(dy-cy));
if (d1 < d3) and (d2 > d3) then
begin
bx:=dx;
by:=dy;
end else
if (d1 < d2) and (d2 < d3) then
begin
ax:=dx;
ay:=dy;
end else
if (d2 > d1) and (d1 > d3) then
begin
cx:=dx;
cy:=dy;
end else
if (d2 < d3) and (d1 > d3) then
begin
bx:=dx;
by:=dy;
end else
if (d3 < d2) and (d2 < d1) then
begin
cx:=dx;
cy:=dy;
end else
if (d2 < d1) and (d1 < d3) then
begin
bx:=dx;
by:=dy;
end;
end;

procedure Sravn;
begin
if per1 > per2 then
Writeln('Yes') else
Writeln('No');
end;

begin
Zapoln;
Perim(1);
Zamena;
Perim(2);
Sravn;
readln;
end.
Небольшое пояснение: Точки A,B и C - углы треугольника.
Точка D - интересующая нас точка.
ICQ: 5311314
[SIGPIC][/SIGPIC]

Последний раз редактировалось AVer; 08.12.2006 в 00:34.
AVer вне форума Ответить с цитированием
Старый 08.12.2006, 08:38   #14
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
Сообщение передача параметров

Код:
procedure Perim(n:integer);
var ...per: real
begin
...
per:= ...;
if n=1 then per1:=per else per2:=per; // глобальные переменные
end;
...
Perim(1);
Zamena;
Perim(2);
лудше делать так:
Код:
// передача значения по адресу
procedure Perim(var per: real);
begin
...
per:= ...;
end;
...
Perim(per1);
Zamena;
Perim(per2);
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 08.12.2006, 16:07   #15
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Продолжая тему... Можно использовать другой алгоритм. Найти площадь главного треуг. а потом точки с каждой стороной (a,b,d ; b,c,d ; a,c,d), и если сумма 3 последних ровна первой, то принадлежит. Вот код:
Код:
var q,w,p,ax,bx,cx,dx,ay,by,cy,dy:real;
    per1,per2,per3,per4:real;

procedure Zapoln;
begin
write('Koordinaty A  ');
readln(ax, ay);
write('Koordinaty B  ');
readln(bx, by);
write('Koordinaty C  ');
readln(cx, cy);
write('Koordinaty D  ');
readln(dx, dy);
end;

procedure Perim(n:integer);
var d1,d2,d3,per:real;
begin
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy));
per:=(d1+d2+d3)/2;
per:=sqrt(per*(per-d1)*(per-d2)*(per-d3));
if n=1 then per1:=per else
if n=2 then per2:=per else
if n=3 then per3:=per else
if n=4 then per4:=per;
end;

procedure Zamena(x:integer);
var d1,d2,d3:real;
begin
if x=1 then
 begin
 q:=cx;
 w:=cy;
 cx:=dx;
 cy:=dy;
 end else
if x=2 then
 begin
 q:=ax;
 w:=ay;
 ax:=dx;
 ay:=dy;
 end else
if x=3 then
 begin
 q:=bx;
 w:=by;
 bx:=dx;
 by:=dy;
 end;
end;

procedure Sravn;
begin
if per1 = p then
Writeln('Yes') else
Writeln('No');
end;

begin
p:=0;
Zapoln;
Perim(1);
Zamena(1);
Perim(2);
cx:=q;
cy:=w;
p:=p+per2;
Zamena(2);
Perim(3);
p:=p+per3;
ax:=q;
ay:=w;
Zamena(3);
Perim(4);
p:=p+4;
writeln(per1:4:2,' ',per2:4:2,' ',per3:4:2,' ',per4:4:2,' ',p:4:2);
Sravn;
readln;
end.
Почему то неправильно ищется сумма, но площади находятся правильно. Где ошибка?
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принадлежность точки Forro Помощь студентам 4 26.05.2008 14:33
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть Дикий Помощь студентам 7 12.05.2008 17:57
Принадлежность точки UnFaithful Паскаль, Turbo Pascal, PascalABC.NET 1 08.01.2008 06:16
Принадлежность объекта по координатам Angel_CJ Помощь студентам 9 12.09.2007 18:43