
clc;
clear all;
N = 10;
L = 1;
Ly=1e-6;
L2=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];
sy=[2 4 2 5 7 7 10 7 7 5];
function polar = angleP(x1, y1, x2, y2)
dx = x2-x1;
dy = y2-y1;
r = sqrt(dx.^2+dy.^2);
sns = dy/r;
ang = abs(asin(sns)); %Значение относительного положения точек по координате игрик в радианах
polar = ang;
if dy == 0 && dx < 0 %Находим полярные углы из положения на окружности
polar = pi();
elseif dx == 0 && dy < 0
polar = 3/2*pi();
elseif dx < 0 && dy > 0
polar = pi() - ang;
elseif dx > 0 && dy < 0
polar = 2*pi() - ang;
elseif dx < 0 && dy < 0
polar = pi() + ang;
end
end
for I = 1:N %Проверка на наличие координаты значение которой меньше обозначенного минимума
if sy(I)<=Ly
L2 = I
end
if sx(L2)>sx(L)
L = L2 %если цикл произведен, то даем переменной L позицию "минимума"
end
end
if L > 1 %Если цикл выше был произведен(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 = angleP(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);
clear all;
N = 10;
L = 1;
Ly=1e-6;
L2=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];
sy=[2 4 2 5 7 7 10 7 7 5];
function polar = angleP(x1, y1, x2, y2)
dx = x2-x1;
dy = y2-y1;
r = sqrt(dx.^2+dy.^2);
sns = dy/r;
ang = abs(asin(sns)); %Значение относительного положения точек по координате игрик в радианах
polar = ang;
if dy == 0 && dx < 0 %Находим полярные углы из положения на окружности
polar = pi();
elseif dx == 0 && dy < 0
polar = 3/2*pi();
elseif dx < 0 && dy > 0
polar = pi() - ang;
elseif dx > 0 && dy < 0
polar = 2*pi() - ang;
elseif dx < 0 && dy < 0
polar = pi() + ang;
end
end
for I = 1:N %Проверка на наличие координаты значение которой меньше обозначенного минимума
if sy(I)<=Ly
L2 = I
end
if sx(L2)>sx(L)
L = L2 %если цикл произведен, то даем переменной L позицию "минимума"
end
end
if L > 1 %Если цикл выше был произведен(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 = angleP(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);