Tengo una imagen que contiene círculos en una ubicación específica y de un diámetro específico. Lo que tengo que hacer es poder calcular puntos aleatorios dentro del círculo y luego manipular los píxeles con los que se correlacionan dichos puntos. Ya tengo el siguiente código:
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 );
}
Y eso funciona bien para encontrar todos los puntos en la circunferencia del círculo, pero necesito todos los puntos de cualquier parte del círculo. Si esto no tiene sentido, hágamelo saber y haré todo lo posible para aclararlo.
Respuestas:
Si desea una solución simple, simplemente aleatorice el radio también:
Sin embargo, eso hace que tus puntos se concentren más hacia el centro del círculo:
Para obtener una distribución uniforme, realice el siguiente cambio en el algoritmo:
Lo que dará el siguiente resultado:
Para obtener más información, consulte el siguiente enlace: MathWorld - Selección de punto de disco .
Y finalmente, aquí hay una demostración simple de JsFiddle que compara ambas versiones del algoritmo.
fuente
¡NO use simplemente r y theta al azar! Esto crea una distribución ponderada con más puntos en el centro. Esta página lo ilustra bien ...
http://mathworld.wolfram.com/DiskPointPicking.html
Aquí está el método que crea una distribución no ponderada ...
fuente
Estás a medio camino. Además de generar un ángulo aleatorio, solo genera una distancia aleatoria, menor o igual que el radio, ponderada para obtener una distribución uniforme:
Ahora estás pensando con polar .
También puede pesar la distancia de esta manera para evitar una raíz cuadrada:
fuente
Si el rendimiento es un problema, entonces una solución alternativa es generar una posición aleatoria en un cuadro con el ancho / alto de su círculo y luego tirar cualquier punto que no esté en el área del círculo.
La ventaja de este método es que no está haciendo funciones cos / sin / sqrt, lo que dependiendo de su plataforma puede ser un gran ahorro de velocidad.
fuente
Tomé el enfoque de uno de los comentarios enumerados y amplié la funcionalidad para crear un sistema de generación de puntos en forma de rosquilla.
Es un enfoque similar al mencionado anteriormente, pero proporcionó resultados diferentes. La parte interna del círculo se dejará en blanco sin puntos.
fuente