Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
никита21
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 4
#1

Каким образом происходит поиск точек для построения оболочки в приведенном коде - Pascal

03.06.2015, 00:22. Просмотров 171. Ответов 0
Метки нет (Все метки)

Объясните пожалуйста, как работает данная программа каким образом происходит поиск точек для построения оболочки, как работает эта подпрограмма "IsLeft".. отдельное спасибо сказал бы за комментарии для строчек кода
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
{ Построение выпуклой оболочки множества }
uses crt,graphABC;
type TPoint=record
x,y: real;
end;
Tvyp=record
x,y:real;
k:integer;{номер точки}
end;
const maxn=1000;
{находится ли точка левее луча}
function IsLeft(p,p1,p2:TPoint):boolean;
begin
IsLeft:=(p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x)>0;
end;
var n,m,i,t1,t,newt:integer;
x0,y0:integer;
ms,a,b:real;
g,z:text;
p:array of TPoint; {Точки множества}
p1:array [1..maxn] of TVyp; {Точки выпуклой оболочки}
used:array [1..maxn] of boolean;{Принадлежит-не принадлежит оболочке}
begin
writeln('Множество точек:');
assign(g, 'D:\Points.txt');
reset(g);
read(g, n);
setlength(p,n+1);
for i :=1 to n do
begin
read(g, a);
p[i].x :=a;
read(g, b);
p[i].y :=b;
write('P[',i:2,'](',p[i].x:5:2,';',p[i].y:5:2,') ');
if i mod 4=0 then writeln;
end;
t1:=1;{первая точка}
for i:=1 to n do
begin
if (p[i].y<p[t1].y) then t1:=i else
if (p[i].y=p[t1].y) and (p[i].x<p[t1].x) then t1:=i;
end;
for i:=1 to n do
used[i]:=false;
writeln;
writeln('Выпуклая оболочка идет через вершины: ');
t:=t1;
m:=0;
repeat
m:=m+1;
p1[m].x:=p[t].x;p1[m].y:=p[t].y;p1[m].k:=t;
used[t]:=true;
newt:=0;
{ Поиск следующей вершины }
for i:=1 to n do
if i<>t then
if (newt=0) or (IsLeft(p[t], p[i], p[newt]))then newt:=i;
t:=newt;
until t=t1;
assign(z,'D:\Koordinati.txt');
rewrite(z);
write(z,'Вершины многоугольника:');
for i:=1 to m do
write(z,'P[',p1[i].k:2,'](',p1[i].x:5:2,';',p1[i].y:5:2,') ');
if i mod 4=0 then writeln;
m:=m+1;
p1[m].x:=p1[1].x;p1[m].y:=p1[1].y;
close(z);
for i:=1 to m do
write('P[',p1[i].k:2,'](',p1[i].x:5:2,';',p1[i].y:5:2,') ');
if i mod 4=0 then writeln;
m:=m+1;
p1[m].x:=p1[1].x;p1[m].y:=p1[1].y;{замкнем оболочку}
writeln;
write('Нажмите Enter для проверки результата графически');
readln;
clearwindow;
setwindowsize(1200,1100);
x0:=windowwidth div 2;
y0:=windowheight div 2;
ms:=(y0-20)/10;
line(x0-y0-1000,y0,x0+y0+1000,y0);
textout(x0+y0+250,y0-17,'X');
line(x0,-1000,x0,windowheight+1000);
textout(x0+5,10,'Y');
textout(x0+5,y0+10,'0');
for i:=1 to 100 do
begin
line(x0-3,y0-round(i*ms),x0+3,y0-round(i*ms));{засечки на оси У}
line(x0-3,y0+round(i*ms),x0+3,y0+round(i*ms));
line(x0+round(i*ms),y0-3,x0+round(i*ms),Y0+3); {засечки на оси Х}
line(x0-round(i*ms),y0-3,x0-round(i*ms),Y0+3);
{подпись оси У}
textout(x0-20,y0-round(i*ms),inttostr(i));{соответственно засечкам}
textout(x0-30,y0+round(i*ms),inttostr(-i));
{подпись оси Х}
textout(x0+round(i*ms),y0+10,inttostr(i));
textout(x0-round(i*ms),y0+10,inttostr(-i));
end;
setpencolor(clBlue);
moveto(x0+round(p1[1].x*ms),y0-round(p1[1].y*ms));
for i:=1 to m do
lineto(x0+round(p1[i].x*ms),y0-round(p1[i].y*ms));
setpencolor(clRed);
setfontcolor(clRed);
for i:=1 to n do
begin
circle(x0+round(p[i].x*ms),y0-round(p[i].y*ms),2);
textout(x0+round(p[i].x*ms)+5,y0-round(p[i].y*ms),inttostr(i));
end;
end.

http://www.cyberforum.ru/pascal/thread765920.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2015, 00:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Каким образом происходит поиск точек для построения оболочки в приведенном коде (Pascal):

Как в приведенном коде можно использовать функцию?
Подскажите, где тут можно использовать функцию? Надо что бы в коде обязательно...

Исправить ошибку в приведенном коде
program lab_17_l_spiral_koordn_spusk; uses crt; var x : real; i : integer;...

Поиск наименьшего пути для построения порта
Уважаемые программисты! Прошу помочь девушке с задачей. На клеточной карте...

Нет ли в приведенном коде функции main?
const eps1 = 1e-6; eps2 = 1e-5; var fx, fy: real; xr, yr: real; lb, rb,...

Нужно ли обнулять переменную в приведенном коде
Как вы думаете при такого роде программе var ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2015, 00:22
Привет! Вот еще темы с решениями:

Каким образом работает swap в приведенном коде?
Каким образом работает swap в коде ниже? #include&lt;list&gt; #include&lt;memory&gt;...

Что происходит в переменных b и у в приведенном коде
Доброго времени суток :) столкнулся вот с такими выражениями int a =...

Почему происходит блокировка потоков в приведенном коде
Здравствуйте. Есть метод run. Создаются и запускаются 2 потока для вызова этого...

Что происходит с флагом переноса в приведенном коде
Добрый день. Возник вопрос: Что происходит с флагом переноса в такой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru