2015-02-17 17 views
10

Chciałbym równomiernie rozprowadzić z góry określony zbiór punktów w okręgu. Przez rozkład jednorodny mam na myśli to, że wszyscy powinni być w równej odległości od siebie (stąd przypadkowe podejście nie zadziała). Próbowałem podejścia heksagonalnego, ale miałem problemy z konsekwentnym osiąganiem skrajnego promienia.Równomiernie rozmieść x punktów wewnątrz okręgu.

Moje bieżące podejście to zagnieżdżona pętla for, w której każda zewnętrzna iteracja zmniejsza promień & liczbę punktów, a każda wewnętrzna pętla równo upuszcza punkty na nowym promieniu. Zasadniczo jest to grupa zagnieżdżonych kręgów. Niestety, jest daleko od równego. Wszelkie wskazówki, jak to zrobić poprawnie?

Nested for-loop result

+0

Spójrz [sekwencje o niskiej discrepenacy] (http://en.wikipedia.org/wiki/Low-discrepancy_sequence#Construction_of_low-discrepancy_sequences). –

+0

Co chcesz zrobić na granicy, czy punkty muszą być równomiernie rozmieszczone wokół granicy koła? W przeciwnym razie możesz wziąć jednolitą siatkę (trójkątną, sześciokątną lub kwadratową) i trzymać z niej tylko punkty w okręgu. –

+0

RobertDodier, dziękuję, niestety, nawet liczby subrandom nie dają korzystnych wyników, ponieważ szansa lądowania 2 punktów blisko siebie jest wciąż stosunkowo wysoka. FamousBlueRaincoat, idealnie, tak, w tym przypadku chciałbym, aby skrajne punkty były równomiernie rozmieszczone wokół krawędzi. –

Odpowiedz

13

cele mające równomierne rozmieszczenie na terenie obszaru i równomiernego rozkładu sprawie konfliktu granicznego; każde rozwiązanie będzie kompromisem między tymi dwoma. Rozszerzyłem sunflower seed arrangement o dodatkowy parametr alpha, który wskazuje, ile dba się o wyrównanie granicy.

alpha=0 daje typowy układ słonecznikowy, z poszarpaną granicy:

alpha0

z alpha=2 granica jest gładsza:

alpha2

(zwiększenie a ponadto jest problematyczne: zbyt wiele punktów kończy się na granicy).

Algorytm umieszcza n punktów, których temperatura k TH umieszczone w odległości sqrt(k-1/2) od granicy (wskaźnik zaczyna k=1), i współrzędnej kątowej 2*pi*k/phi^2 gdzie phi jest stosunek złotem. Wyjątek: ostatnie punkty alpha*sqrt(n) są umieszczane na zewnętrznej granicy okręgu, a promień biegunowy innych punktów jest skalowany, aby to uwzględnić. To obliczenie promienia biegunowego jest wykonywane w funkcji radius. Jest to kodowane w MATLAB.

function sunflower(n, alpha) % example: n=500, alpha=2 
    clf 
    hold on 
    b = round(alpha*sqrt(n));  % number of boundary points 
    phi = (sqrt(5)+1)/2;   % golden ratio 
    for k=1:n 
     r = radius(k,n,b); 
     theta = 2*pi*k/phi^2; 
     plot(r*cos(theta), r*sin(theta), 'r*'); 
    end 
end 

function r = radius(k,n,b) 
    if k>n-b 
     r = 1;   % put on the boundary 
    else 
     r = sqrt(k-1/2)/sqrt(n-(b+1)/2);  % apply square root 
    end 
end 
+0

Działa to świetnie. Dla przyszłych czytelników, zrobiłem to geodezyjnie, obracając theta w łożysko, aby móc przekazać je do funkcji docelowej. Zrobiłem to za pomocą następującej linii: theta = k * (720 - 360 * phi) '. Wygląda to poprawnie, ale jeśli jestem w błędzie * proszę * popraw mnie. –

+0

Myślę, że 720 jest zbędny; po pomnożeniu przez k, to tylko 2 * k pełnych obrotów. Zamiast tego możesz użyć 'theta = -k * 360 * phi'; lub 'theta = k * 360 * phi', ponieważ znak minus jest po prostu odbiciem lustrzanym. –

+0

Jeszcze raz! Wygląda na to, że potrzebuję odświeżenia w geometrii: - /. –

Powiązane problemy