Mam obraz, który zawiera koła w określonym miejscu i o określonej średnicy. Muszę tylko obliczyć losowe punkty w okręgu, a następnie manipulować pikselami, z którymi te punkty się korelują. Mam już następujący kod:
private Point CalculatePoint()
{
var angle = _random.NextDouble() * ( Math.PI * 2 );
var x = _originX + ( _radius * Math.Cos( angle ) );
var y = _originY + ( _radius * Math.Sin( angle ) );
return new Point( ( int )x, ( int )y );
}
I to działa dobrze, aby znaleźć wszystkie punkty na obwodzie koła, ale potrzebuję wszystkich punktów z dowolnego miejsca w okręgu. Jeśli to nie ma sensu, daj mi znać, a ja postaram się wyjaśnić.
Odpowiedzi:
Jeśli chcesz prostego rozwiązania, po prostu losuj również promień:
To jednak powoduje, że twoje punkty są bardziej skoncentrowane w kierunku środka koła:
Aby uzyskać jednolity rozkład, wprowadź następującą zmianę w algorytmie:
Co da następujący wynik:
Aby uzyskać więcej informacji, sprawdź następujący link: MathWorld - Wybór punktu dysku .
I w końcu oto prosta demonstracja JsFiddle porównująca obie wersje algorytmu.
źródło
NIE używaj po prostu losowego r i theta! Tworzy to rozkład ważony z większą liczbą punktów w środku. Ta strona dobrze to ilustruje ...
http://mathworld.wolfram.com/DiskPointPicking.html
Oto metoda, która tworzy nieważony rozkład ...
źródło
Jesteś w połowie drogi. Oprócz generowania losowego kąta, po prostu wygeneruj losową odległość, mniejszą lub równą promieniu, ważoną, aby uzyskać jednolity rozkład:
Teraz myślisz z biegunem .
Możesz także zważyć taką odległość, aby uniknąć pierwiastka kwadratowego:
źródło
Jeśli wydajność stanowi problem, jednym z alternatywnych rozwiązań jest wygenerowanie losowej pozycji w polu o szerokości / wysokości koła, a następnie wyrzucenie punktów, które nie znajdują się w obszarze koła.
Zaletą tej metody jest brak wykonywania funkcji cos / sin / sqrt, co w zależności od platformy może być dużą oszczędnością prędkości.
źródło
Przyjąłem podejście do jednego z wymienionych komentarzy i rozszerzyłem funkcjonalność o system generowania punktów w kształcie pączka.
Jest to podobne podejście, jak wspomniano wcześniej, ale zapewniło inne wyniki. Wewnętrzna część koła pozostanie pusta bez punktów.
źródło