2016-07-17 3 views
0

Я пытаюсь создать N случайные пары точек (N = 50) заданных расстояний, внутри шестиугольника 500. Расстояние D, созданное с использованием (dmax - dmin).*rand(N,1) + dmin, с dmin = 10 и dmax = 100 в Matlab. Я понимаю, что первым я должен создать набор точек ([x1 y1]), которые имеют по крайней мере расстояние D с главной границы шестиугольника, затем сгенерируют второй набор точек ([x2 y2]), которые имеют точное расстояние D от первого набора. Но когда-то у меня возникла проблема со второй точкой вне шестиугольника, потому что если первая позиция на границе гексаголя и плюс D disance, то вторая позиция находится за пределами шестиугольника (я имею в виду, что я хочу создать случайную парную позицию внутри гексагона). Может ли кто-нибудь помочь мне в создании такого сценария и решить проблему? Благодарю.Как создать случайные позиции с расстоянием между ними внутри шестиугольника?

Например, как

R    = 500; % hexagol radius 
N    = 50; % number pair positions 
d_min   = 10; % minimum distance   
d_max   = 100; % maximum distance  
D    = (d_max - d_min).*rand(N,1) + d_min; % randomly distance 
X    = [0,0]; % hexagol center 
j=0; 
while j < N 
    j=j+1; 
    theta(j)=2*pi*rand(1,1); 
    u= rand()+ rand(); 
    if u < 1 
     r(j) = R * u; 
    else 
     r(j) = R * (2 - u); 
    end 
% to create the first position 
    x1(j)=r(j)*cos(theta(j)) + X(1,1); % first x positions 
    y1(j)=r(j)*sin(theta(j)) + X(1,2); % first y positions 
end 
% to create the second position 
x2(j) = x1(j) + D(j); % second x positions 
y2(j) = y1(j) + D(j); % second y positions 

ответ

1

Это совсем как ваш other question и ее решение является почти то же самое, но для этого нужно немного больше математики. Давайте сосредоточимся на одной паре очков. Там все еще два этапа:

Шаг 1: Найти случайную точку, которая находится внутри шестиугольника, и имеет расстояние d от границы.

Шаг 2: Найти другой объект, который имеет расстояние d от первой точки.

Основная проблема Ставка 1. Можно сказать, что точки, которые имеют расстояние d, образуют шестиугольник с радиусом r, фактически внутри шестиугольника с радиусом r-d. Тогда нам просто нужно найти случайную точку, которая лежит на шестиугольнике!

Polar Формула Шестигранники:

Я хочу, чтобы решить эту проблему в полярном пространстве, так что я должен сформулировать шестиугольники в этом пространстве. Помните круг формулу в полярном пространстве:

enter image description here

Формула шестиугольника в полярном пространстве в значительной степени, как и его окружать круг, за исключением того, что радиус шестиугольника отличается на каждый t (угла). Назовем этот изменяющийся радиус r2. Таким образом, если мы найдем функцию R2, которая возвращает r2 для всех t с, то мы можем написать полярную формулу для шестиугольника:

enter image description here

Это изображение показывает параметры задачи:

**Image**

Ключевым параметром здесь является α.Теперь нам нужна функция Alpha, которая возвращает α для всех t с:

enter image description here

Теперь у нас есть все точки на границе шестигранника в полярном пространстве:

r = 500; 
T = linspace(0, 2*pi, 181); 
Alpha = @(t) pi/2-abs(rem(t, pi/3)-(pi/6)); 
R2 = @(t) r*cos(pi/6)./sin(Alpha(t)); 
X = R2(T).*cos(T); 
Y = R2(T).*sin(T); 

hold on 
plot(X, Y, '.b'); 
plot((r).*cos(T), (r).*sin(T), '.r') 

**image**

Полярная формула регулярного многоугольника:

Прежде чем я продолжу, я хотел бы обобщить Alpha и R2 функции охватывают все regular polygons:

Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n))); 
R2 = @(t) r*cos(pi/n)./sin(Alpha(t)); 

Где n это число ребер многоугольника.

**image**

Ответ:

Теперь мы можем генерировать пары точек, как и то, что мы сделали для задачи круга:

r = 500; n = 6; 
a = 10; b = 50; 
N = 100; 
D = (b - a).*rand(N,1) + a; 

Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n))); 
R2 = @(t) r*cos(pi/n)./sin(Alpha(t)); 

T1 = rand(N, 1) * 2 * pi; 
RT1 = rand(N, 1) .* (R2(T1)-D); 
X1 = RT1.*cos(T1); 
Y1 = RT1.*sin(T1); 

T2 = rand(N, 1) * 2 * pi; 
X2 = X1+D.*cos(T2); 
Y2 = Y1+D.*sin(T2); 

enter image description here

Вращающийся полигон :

Для поворота многоугольника нам просто нужно обновить Alpha функцию:

t0 = pi/8; 
Alpha = @(t) pi/2-abs(rem(t+t0, 2*pi/(n))-(pi/(n))); 

это тест для n=7, N=50000 и t0=pi/10:

![**image**

+0

Я понимаю вашу мысль, спасибо очень. Я скоро отправлю свой исходный код, с куском, который немного отличается от вас. Еще раз благодарю вас за помощь. – user3727281

Смежные вопросы