У меня есть изображение, которое содержит круги в определенном месте и определенного диаметра. Что мне нужно сделать, так это уметь вычислять случайные точки внутри круга, а затем манипулировать пикселями, с которыми эти точки соотносятся. У меня уже есть следующий код:
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 );
}
И это прекрасно работает для нахождения всех точек по окружности круга, но мне нужны все точки из любой точки круга. Если это не имеет смысла, дайте мне знать, и я сделаю все возможное, чтобы уточнить.
Ответы:
Если вы хотите простое решение, просто рандомизируйте радиус:
Это, однако, приводит к тому, что ваши точки становятся более сосредоточенными к центру круга:
Чтобы получить равномерное распределение, внесите следующие изменения в алгоритм:
Который даст следующий результат:
Для получения дополнительной информации проверьте следующую ссылку: MathWorld - Disk Point Picking .
И, наконец, простая демонстрация JsFiddle, сравнивающая обе версии алгоритма.
источник
НЕ просто используйте случайные r и theta! Это создает взвешенное распределение с большим количеством точек в центре. Эта страница хорошо иллюстрирует это ...
http://mathworld.wolfram.com/DiskPointPicking.html
Вот метод, который создает невзвешенное распределение ...
источник
Ты на полпути. В дополнение к генерации случайного угла, просто сгенерируйте случайное расстояние, меньшее или равное радиусу, взвешенное так, чтобы вы получили равномерное распределение:
Теперь ты думаешь с полярностью .
Вы также можете взвесить расстояние, чтобы избежать квадратного корня:
источник
Если производительность является проблемой, то одним из альтернативных решений является создание случайного положения в поле с шириной / высотой вашего круга, а затем отбрасывание любых точек, которые не находятся в области круга.
Преимущество этого метода заключается в том, что вы не выполняете функции cos / sin / sqrt, что в зависимости от вашей платформы может значительно сэкономить на скорости.
источник
Я воспользовался подходом одного из перечисленных комментариев и расширил функциональность, чтобы создать систему генерации точек в форме пончика.
Это похожий подход, как уже упоминалось ранее, но он дал другие результаты. Внутренняя часть круга останется пустой без точек.
источник