Можно, конечно, хранить как 24 бита, но это значит байтовая выборка и надо смотреть, что выгодней - скорострельность или память.
- - - Добавлено - - -
А они точно там нужны?
И это для тебя они меньше нуля, в на ВМ2 это будут целые числа с определённым число подразумеваемых разрядов после запятой - то есть типа - умножили на 5 разделили на 10.
Что опять похоже на то, что я делал в SPEED3
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Мерить надо. Учитывая извращения в организации работы с памятью в УКНЦ, особенно в ПП процессоре - не могу сказать.
Плюс на это накладывается требования к памяти - может, будет достаточно памяти под цифровые данные и не надо будет мудрить с хранением полутора слов
Это и называется - подразумеваемое количество разрядов (цифр) после запятой.
- - - Добавлено - - -
Учитывая целочисленность координат, смотрим, какие значения углов возможны (с учётом симметрии), смотрим для них значения синусов-косинусов, подбираем пару чисел - на первое умножить, на второе разделить. С учётом ограничений количество разряд - вполне возможно, что количество значений синусов-косинусов ещё сократится
Вот тебе пример для 8ми бит
;
; resets rotation part of matrix
; r1 - address of 3x2 s7.8 fixed point transform matrix
; clobbers: r0, r1
;
resetrotmtx:
mov #400, r0 ; unit
mov r0, (r1)+ ; x -> x'
clr (r1)+ ; y -> x'
tst (r1)+ ; skip offset
clr (r1)+ ; x -> y'
mov r0, (r1)+ ; y -> y'
ret
;
; calculates a rotation/scale part of transform matrix for a given angle
; r0 - angle
; r1 - address of 3x2 s7.8 fixed point transform matrix
; r2 - special transform bit flags:
; r2.0 - y flip (mathematical to screen transform)
; r2.1 - scale x by 0.75 (screen aspect ratio correction)
; clobbers: nothing
;
makerotmtx:
; x' = x * cos - y * sin
; y' = x * sin + y * cos
mov r0, -(sp)
call cos
mov r0, @r1 ; x -> x'
mov r0, 10(r1) ; y -> y'
mov @sp, r0
call sin
mov r0, 6(r1) ; x -> y'
neg r0
mov r0, 2(r1) ; y -> x'
bit #1, r2 ; y flip
beq 30$
neg 6(r1)
neg 10(r1)
30$: bit #2, r2 ; x downscale
beq 31$
mov @r1, r0
asr r0
asr r0
sub r0, @r1
mov 2(r1), r0
asr r0
asr r0
sub r0, 2(r1)
31$: mov (sp)+, r0
ret
;
; Transform a list of 8-bit points by the given matrix
;
; r4 - source
; r5 - destination
; r3 - count
; stack - transform matrix
;
dotransform:
mov r3, -(sp)
; now matrix base offset is 4
50$: ; calculate x'
movb (r4)+, r3 ; x
mov r3, r0
mov 4(sp), r1 ; x -> x'
call mul8x8s
mov r0, @r5
movb @r4, r0 ; y
mov 6(sp), r1 ; y -> x'
call mul8x8s
; accumulate & store x'
add @r5, r0
add 10(sp), r0 ; x' offset
swab r0
movb r0, (r5)+
; calculate y'
mov r3, r0 ; x
mov 12(sp), r1 ; x -> y'
call mul8x8s
mov r0, r3
movb (r4)+, r0 ; y
mov 14(sp), r1 ; y -> y'
call mul8x8s
; accumulate and store y
add r3, r0
add 16(sp), r0 ; y' offset
swab r0
movb r0, (r5)+
; loop until the end
dec @sp
bne 50$
; done
tst (sp)+
ret
;
- - - Добавлено - - -
Вся красота в другом.. хоть координаты на экране и целочисленные.... ты суммируешь все объекты в натуральных числах..при переполнении ты сдвинешся на пиксель
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Если ты думаешь, что я буду в нём разбираться, то ошибаешься.
Что то у нас такое было в курсе по численным методам про трансформацию трёхмерки БЕЗ матрицы - ищи.
Я окончил мехмат больше 20 лет назад, с этим дел больше не имел, так что не помню и вспоминать не тянет, так как личных моих интересов в этой области, по крайне мере пока, нет.
- - - Добавлено - - -
Если ты думаешь, что сброшенное сюда ЭТО в ТАКОМ виде вызовет какие то эстетические чувства - то сильно ошибаешься.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Перекур.. Осталось 24 страниц...
Или - сделано 40 из 64-ёх
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)