 
        
        
        
    - •Алгоритм для построения выпуклой оболочки набора точек (Jarvis)
- •Цель работы.
- •Блок-схема программы для нахождения полярного угла вектора 1-2.
- •Текст программы 1.
- •Блок-схема алгоритма построения выпуклой оболочки набора точек (Jarvis) и вывода результатов
- •Текст программы 2 (Алгоритм Джарвиса).
- •Листинг 2
- •Вывод:
МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра физической электроники и технологии
ОТЧЕТ по лабораторной работе №6
по дисциплине «Информационные технологии» Тема: Алгоритмы и программы решения задач комбинаторики
| Студентка гр. 0207 | 
 | Лиоско Е.П. | |
| Преподаватель | 
 | 
 | Рябцев И.А. | 
Санкт-Петербург
2021
 
Алгоритм для построения выпуклой оболочки набора точек (Jarvis)
Цель работы.
Изучение и программирование алгоритма построения выпуклой оболочки набора точек.
Блок-схема программы для нахождения полярного угла вектора 1-2.
Текст программы 1.
clear;
clc;
sx=[1, -1, -1, 1, 1]; sy=[1, 1, -1, -1, 1]; for i=1:4
x1=sx(i); y1=sy (i); x2=sx(i+1); y2=sy(i+1);
p=anglePolar(x1,y1,x2,y2);
disp(p);
end
hp=compass(sx,sy); % построение векторов
2
 
function[polar]=angle(x1,y1,x2,y2) dx=x2-x1;
dy=y2-y1; r=sqrt(dx^2+dy^2); sns=dy/r; ang=asin(sns); polar=ang;
if dx<0 polar=pi()-ang;
else
if (dy<0) && (dx>0) polar=pi()-ang;
end
end end
Листинг 1
3.1416 -1.5708
0
1.5708
Блок-схема алгоритма построения выпуклой оболочки набора точек (Jarvis) и вывода результатов
3
 
Текст программы 2 (Алгоритм Джарвиса).
| clc; | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
| clear all; | 
 | 
 | 
 | 
 | 
 | ||
| n = | 10; | 
 | 
 | 
 | 
 | 
 | 
 | 
| l = | 1; | 
 | 
 | 
 | 
 | 
 | 
 | 
| l2 = 1; | 
 | 
 | 
 | 
 | 
 | 
 | |
| s = | [2, | 2; 5, 4; 8, 2; | 
 | ||||
| 7, | 5; | 9, | 7; | 6, | 7; | 
 | 
 | 
| 5, | 10; | 4, | 7; | 1, | 7; | 3, | 5]; | 
| sx = [2 | 5 8 7 9 6 5 4 1 3 0]; | ||||||
| sy = [2 | 4 2 5 7 7 10 7 7 5 0]; | ||||||
| for | i = | 2:n | 
 | 
 | 
 | 
 | |
| if | sy(i) <= sy(l) | 
 | 
 | ||||
| l2 | = i; | 
 | 
 | 
 | 
 | 
 | |
| end | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
| if | sx(l2) < sx(l) | 
 | 
 | ||||
l = l2; end
end
4
if l > 1
px = sx(1); py = sy(1);
sx(1) = sx(l); sy(1) = sy(l); sx(l) = px; sx(l) = py; end
sx(n+1) = sx(1); sy(n+1) = sy(1); bsangl = 0;
k = 2; m = 0;
dxy = 1;
while (k < (n+2) && dxy > 0) m = m+1;
polark = 100; for i = k:(n+1)
polar = anglePolar(sx(k-1), sy(k-1), sx(i), sy(i)); if polar < polark && polar >= bsangl
polark = polar; kplr = i;
end end
bsangl = polark; px = sx(k);
py = sy(k);
sx(k) = sx(kplr); sy(k) = sy(kplr); sx(kplr) = px; sy(kplr) = py;
dx = abs(sx(k)-sx(1)); dy = abs(sy(k)-sy(1)); dxy = dx+dy;
k = k + 1; end
plot(sx, sy, 'bo'); hold on;
plot(sx(1:m+1), sy(1:m+1), 'b-'); disp(m);
disp(sx);
disp(sy);
function polar = anglePolar(x1, y1, x2, y2) dx = x2-x1;
dy = y2-y1;
r = sqrt(dx.^2+dy.^2); sns = dy/r;
5
