Инструменты пользователя

Инструменты сайта


trigonometry

Это старая версия документа!


Целочисленная тригонометрия

На PlayStation все вычисления рекомендуется производить в целочисленной арифметике, и синусы/косинусы - не исключение.

Самый эффективный способ реализации тригонометрии - таблица синусов. На самой консоли ничего вычислять не нужно, вместо этого функция sin просто обращается к таблице по индексу, полученному из угла. Таблица вычисляется заранее на ПК и сохраняется в виде массива из 16-битных целых. Чем больше таблица, тем выше угловая точность.

Пример программы на D, которая генерирует таблицу синусов для 4096 углов (8 KiB):

import std.math: sin, PI, round;
import std.file: write;
 
enum COUNT = 4096;
enum SCALE = 0x1000;
 
void main()
{
    ubyte[] data;
    data.length = COUNT * 2;
 
    foreach (i; 0..COUNT)
    {
        double angle = 2.0 * PI * i / COUNT;
        short value = cast(short)round(sin(angle) * SCALE);
 
        data[i * 2 + 0] = cast(ubyte)(value & 0xff);
        data[i * 2 + 1] = cast(ubyte)(value >> 8);
    }
 
    write("sin4096.bin", data);
}

Функция чтения:

Косинус реализуется аналогично, но со сдвигом по фазе:

Точность метода достаточна для представления поворотов в 3D-играх. Чем больше угловая скорость, тем менее заметны артефакты дискретности.

trigonometry.1792143880.txt.gz · Последнее изменение: — gecko

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki