Algoritma untuk membangun sudut-sudut poligon beraturan n-sided


10

Saya telah menelusuri ini menggunakan banyak kombinasi kata kunci, tetapi yang mengejutkan saya, saya tidak dapat menemukan algoritme untuk membuat poligon bersisi-n biasa menjadi lingkaran tertentu, yaitu menemukan koordinat untuk titik sudut n . Yang bisa saya temukan hanyalah instruksi bagaimana melakukannya dengan kompas fisik dan penggaris-sejajar, atau plug-in browser interaktif tanpa sumber.

Jadi di mana saya bisa menemukan algoritma seperti itu?


2
Biarkan saya mengembalikan kepercayaan Anda pada Google. ;-) Hit keempat untuk "algoritme poligon reguler": gamedev.net/topic/… "Lalu, menggunakan trigonometri dasar, pilih n titik yang berjarak sama di sekitar lingkaran lingkaran (yaitu - jika n adalah 3, pilih 3 poin pada keliling yang 120 derajat terpisah satu sama lain). " Yang persis seperti yang dilakukan kode Kevin.
Eric

Jawaban:


15

Dengan ipergi dari 0 to n-1inklusif:

pointX[i] = ( sin( i / n * 2 * PI ) * radius ) + xOffset;
pointY[i] = ( cos( i / n * 2 * PI ) * radius ) + yOffset;

Sunting: Seperti yang disebutkan Lars Viklund dalam komentar, ini hanya aman dalam bahasa seperti javascript di mana pembagian integer mengembalikan angka floating point daripada integer. Dalam bahasa lain, Anda harus terlebih dahulu melakukan casting i.


3
Waspadalah jebakan pembagian integral dalam i / n dalam bahasa di mana pembagian bilangan bulat menghasilkan bilangan bulat.
Lars Viklund

Aah poin yang sangat bagus, saya akan menambahkan peringatan itu dalam jawabannya.
Elva

Ini tidak perlu dikatakan, tetapi Anda juga ingin menjaga terhadap kasus di mana n * 2 * PI == 0atau Anda akan memiliki satu poligon yang tidak bahagia :(.
Zack The Human

Cegah aneh meluap satu-satunya n dengan yang n * 2 * PI == 0bisa saya pikirkan adalah 0, yang sejauh yang saya tahu tidak terdefinisi, sama dengan i / 0. Jadi tidak masalah kan? :)
Elva
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.