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

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

03.06.2015, 00:22. Просмотров 174. Ответов 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2015, 00:22
Ответы с готовыми решениями:

Из заданного множества точек на плоскости выбрать две различные точки так, чтобы количества точек различались наименьшим образом
Из заданного множества точек на плоскости выбрать две различные точки так, чтобы количества точек,...

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

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

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

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

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

Нужно ли обнулять переменную в приведенном коде
Как вы думаете при такого роде программе var i,j,r:integer; ...

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

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


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

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

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