Saya sedang memikirkan platform dan musuh yang bergerak berputar-putar di game 2D lama, dan saya bertanya-tanya bagaimana itu dilakukan. Saya mengerti persamaan parametrik, dan itu sepele untuk menggunakan dosa dan cos untuk melakukannya, tetapi bisakah NES atau SNES membuat panggilan waktu nyata? Saya mengakui ketidaktahuan yang berat, tetapi saya pikir itu adalah operasi yang mahal. Apakah ada cara pintar untuk menghitung gerakan itu dengan lebih murah?
Saya telah bekerja untuk mendapatkan algoritme dari identitas jumlah trigonometri yang hanya akan menggunakan trigon prakiraan, tetapi tampaknya berbelit-belit.
Jawaban:
Pada perangkat keras seperti yang Anda gambarkan, solusi umum untuk kasus umum adalah dengan hanya menghasilkan tabel pencarian untuk fungsi trigonometri yang diminati, kadang-kadang bersamaan dengan representasi titik tetap untuk nilai.
Masalah potensial dengan teknik ini adalah ia menghabiskan ruang memori, meskipun Anda bisa mengecilkan ini dengan menetapkan resolusi data yang lebih rendah di tabel Anda atau dengan mengambil keuntungan dari sifat periodik dari beberapa fungsi untuk menyimpan lebih sedikit data dan mencerminkannya saat runtime.
Namun, untuk secara khusus melintasi lingkaran - baik untuk meraster mereka atau untuk memindahkan sesuatu, variasi algoritma garis Bresenham dapat digunakan . Algoritma Bresenham yang sebenarnya , tentu saja, juga berguna untuk melintasi garis yang tidak berada di delapan arah "primer" dengan cukup murah.
sumber
Ada variasi dari algoritma Bresenham oleh James Frith , yang seharusnya lebih cepat karena sepenuhnya menghilangkan multiplikasi. Tidak perlu tabel pencarian untuk mencapai ini, meskipun orang bisa menyimpan hasilnya dalam tabel jika radius tetap konstan. Karena algoritma Bresenham dan Frith menggunakan simetri 8 kali lipat, tabel pencarian ini akan relatif pendek.
sumber
xoff++ + xoff
dan--yoff + yoff
. Daftar perubahan Anda akan memperbaikinya, pertimbangkan untuk memperbaikinya dan bukan sebagai catatan. (Lihat bagian 5 paragraf 4 standar C ++ untuk contoh-contoh dan orang-orang standard yang secara eksplisit menyebut ini)balance += xoff++ + xoff
danbalance -= --yoff + yoff
. Saya meninggalkan ini tidak berubah, karena ini adalah cara algoritma Frith awalnya ditulis, dengan perbaikan yang kemudian ditambahkan sendiri (lihat di sini ). Diperbaiki sekarangAnda juga dapat menggunakan versi perkiraan fungsi trigonometri menggunakan Taylor Expansions http://en.wikipedia.org/wiki/Taylor_series
Sebagai contoh, Anda dapat memiliki perkiraan yang wajar tentang sinus menggunakan empat istilah seri taylor pertama
sumber
Salah satu algoritma yang luar biasa untuk melakukan perjalanan secara seragam di atas lingkaran adalah algoritma Goertzel . Ini hanya membutuhkan 2 perkalian dan 2 penambahan per langkah, tidak ada tabel pencarian, dan status yang sangat minimal (4 angka).
Pertama, tentukan beberapa konstanta, mungkin hardcoded, berdasarkan ukuran langkah yang diperlukan (dalam hal ini, 2π / 64):
Algoritma menggunakan 4 angka sebagai statusnya, diinisialisasi seperti ini:
Dan akhirnya loop utama:
Kemudian bisa pergi selamanya. Inilah 50 poin pertama:
Algoritme tentu saja dapat bekerja pada perangkat keras titik tetap. Kemenangan yang jelas melawan Bresenham adalah kecepatan konstan di atas lingkaran.
sumber