mirror of
https://github.com/dschmenk/PLASMA.git
synced 2026-01-22 18:15:59 +00:00
Add rounding to sin/cos calc to improve accuracy
This commit is contained in:
@@ -1,13 +1,16 @@
|
||||
include "inc/cmdsys.plh"
|
||||
include "inc/int32.plh"
|
||||
|
||||
byte sin90hi[]
|
||||
byte = $00,$04,$09,$0D,$12,$16,$1B,$1F,$23,$28,$2C,$31,$35,$39,$3E,$42
|
||||
byte = $46,$4B,$4F,$53,$57,$5B,$60,$64,$68,$6C,$70,$74,$78,$7C,$7F,$83
|
||||
byte = $87,$8B,$8F,$92,$96,$99,$9D,$A0,$A4,$A7,$AB,$AE,$B1,$B4,$B7,$BA
|
||||
byte = $BE,$C0,$C3,$C6,$C9,$CC,$CE,$D1,$D3,$D6,$D8,$DB,$DD,$DF,$E1,$E3
|
||||
byte = $E5,$E7,$E9,$EB,$EC,$EE,$F0,$F1,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA
|
||||
byte = $FB,$FC,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF
|
||||
word sin90[]
|
||||
word = $0000,$0478,$08EF,$0D66,$11DC,$1650,$1AC2,$1F33,$23A1,$280C
|
||||
word = $2C74,$30D9,$353A,$3996,$3DEF,$4242,$4690,$4AD9,$4F1C,$5358
|
||||
word = $578F,$5BBE,$5FE6,$6407,$6820,$6C31,$7039,$7439,$782F,$7C1C
|
||||
word = $8000,$83DA,$87A9,$8B6D,$8F27,$92D6,$9679,$9A11,$9D9C,$A11B
|
||||
word = $A48E,$A7F3,$AB4C,$AE97,$B1D5,$B505,$B827,$BB3A,$BE3F,$C135
|
||||
word = $C41B,$C6F3,$C9BB,$CC73,$CF1C,$D1B4,$D43C,$D6B3,$D91A,$DB6F
|
||||
word = $DDB4,$DFE7,$E209,$E419,$E617,$E804,$E9DE,$EBA6,$ED5C,$EEFF
|
||||
word = $F090,$F20E,$F378,$F4D0,$F615,$F747,$F865,$F970,$FA68,$FB4C
|
||||
word = $FC1C,$FCD9,$FD82,$FE18,$FE99,$FF07,$FF60,$FFA6,$FFD8,$FFF6
|
||||
|
||||
def sin32(deg)#0
|
||||
word[2] i32
|
||||
@@ -15,22 +18,22 @@ def sin32(deg)#0
|
||||
while deg >= 360; deg = deg - 360; loop
|
||||
while deg < 0; deg = deg + 360; loop
|
||||
if deg < 90
|
||||
i32[0] = ((sin90hi[deg] << 8) | sin90hi[deg])
|
||||
i32[0] = (sin90[deg])
|
||||
i32[1] = 0
|
||||
elsif deg == 90
|
||||
i32[0] = 0
|
||||
i32[1] = 1
|
||||
elsif deg <= 180
|
||||
i32[0] = ((sin90hi[180 - deg] << 8) | sin90hi[180 - deg])
|
||||
i32[0] = (sin90[180 - deg])
|
||||
i32[1] = 0
|
||||
elsif deg < 270
|
||||
i32[0] = -((sin90hi[deg - 180] << 8) | sin90hi[deg - 180])
|
||||
i32[0] = -(sin90[deg - 180])
|
||||
i32[1] = -1
|
||||
elsif deg == 270
|
||||
i32[0] = 0
|
||||
i32[1] = -1
|
||||
else
|
||||
i32[0] = -((sin90hi[360 - deg] << 8) | sin90hi[360 - deg])
|
||||
i32[0] = -(sin90[360 - deg])
|
||||
i32[1] = -1
|
||||
fin
|
||||
load32(@i32)
|
||||
@@ -40,6 +43,7 @@ export def mulsin(val, deg)
|
||||
word[2] i32
|
||||
sin32(deg)
|
||||
muli16(val)
|
||||
addi16($7FFF) // Round up
|
||||
store32(@i32)
|
||||
return i32[1]
|
||||
end
|
||||
@@ -48,6 +52,7 @@ export def mulcos(val, deg)
|
||||
word[2] i32
|
||||
sin32(deg + 90)
|
||||
muli16(val)
|
||||
addi16($7FFF) // Round up
|
||||
store32(@i32)
|
||||
return i32[1]
|
||||
end
|
||||
|
||||
@@ -9,7 +9,7 @@ SRC" TURTLE.4TH"
|
||||
: SHOW
|
||||
0 HGRMODE HGRDRAWBUF TILEDRAWBUF DROP
|
||||
280 192 INITTURTLE
|
||||
1 HGRCOLOR
|
||||
3 HGRCOLOR
|
||||
;
|
||||
|
||||
: SQUARE
|
||||
@@ -20,7 +20,7 @@ SRC" TURTLE.4TH"
|
||||
;
|
||||
|
||||
: SPIN
|
||||
360 0 DO
|
||||
361 0 DO
|
||||
50 SQUARE
|
||||
I TURNTO
|
||||
10 +LOOP
|
||||
@@ -30,3 +30,5 @@ SRC" TURTLE.4TH"
|
||||
SHOW
|
||||
SPIN
|
||||
;
|
||||
|
||||
SHOW SPIN
|
||||
Reference in New Issue
Block a user