Saya memiliki gambar yang berisi lingkaran di lokasi tertentu, dan dengan diameter tertentu. Yang perlu saya lakukan adalah untuk dapat menghitung titik acak di dalam lingkaran, dan kemudian memanipulasi piksel kata titik berkorelasi. Saya sudah memiliki kode berikut:
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 );
}
Dan itu berfungsi dengan baik untuk menemukan semua titik di lingkaran lingkaran, tetapi saya membutuhkan semua titik dari mana saja di lingkaran. Jika ini tidak masuk akal, beri tahu saya dan saya akan melakukan yang terbaik untuk mengklarifikasi.
Jawaban:
Jika Anda menginginkan solusi sederhana, acak saja radiusnya:
Namun itu menghasilkan poin Anda lebih terkonsentrasi ke pusat lingkaran:
Untuk mendapatkan distribusi yang seragam, lakukan perubahan berikut pada algoritme:
Yang akan memberikan hasil sebagai berikut:
Untuk informasi lebih lanjut, periksa tautan berikut: MathWorld - Disk Point Picking .
Dan akhirnya inilah demonstrasi JsFiddle sederhana yang membandingkan kedua versi algoritma.
sumber
JANGAN gunakan r dan theta secara acak! Ini menciptakan distribusi tertimbang dengan lebih banyak poin di tengah. Halaman ini menggambarkan dengan baik ...
http://mathworld.wolfram.com/DiskPointPicking.html
Inilah metode yang membuat distribusi non-tertimbang ...
sumber
Anda setengah jalan di sana. Selain menghasilkan sudut acak, hanya menghasilkan jarak acak, kurang dari atau sama dengan jari-jari, tertimbang sehingga Anda mendapatkan distribusi yang seragam:
Sekarang Anda berpikir dengan kutub .
Anda juga dapat mempertimbangkan jarak seperti itu untuk menghindari akar kuadrat:
sumber
Jika kinerja merupakan masalah, maka salah satu solusi alternatif adalah menghasilkan posisi acak dalam sebuah kotak dengan lebar / tinggi lingkaran Anda dan kemudian membuang semua titik yang tidak berada di area lingkaran.
Keuntungan dari metode ini adalah Anda tidak melakukan fungsi cos / sin / sqrt, yang tergantung pada platform Anda mungkin merupakan penghematan kecepatan yang besar.
sumber
Saya telah mengambil pendekatan dari salah satu komentar yang tercantum, dan memperluas fungsionalitas untuk membuat sistem pembuatan titik berbentuk donat.
Ini adalah pendekatan yang sama seperti yang disebutkan sebelumnya tetapi memberikan hasil yang berbeda. Bagian dalam lingkaran akan dibiarkan kosong tanpa poin.
sumber