Schnelle Hypot Methode für kleine a b (a<=10,b<=10)
Verfasst: 10.01.2025 15:56
				
				Moin,
Peter hatte AFAIK letztens erst eine flotte Methode ausgeknobelt für SQRT(a*a + b*b), um z.B. die genauere Entfernung zu messen.
Für Pacmen war ich faul und habe einfach abs(a)+abs(b) verwendet.
Für mein neuestes Projekt brauche ich es aber etwas genauer, soll ja besser aussehen. Allerdings ist mir Peters Methode viel zu langsam und meine x,y Werte sind recht klein (<=10)
Hier also mal meine Version von sqr(x*x + y*y), die Tabellen verwendet und damit sehr flott arbeitet. Kann auch als Idee verstanden werden, wie man so etwas machen könnte.
Hier noch der Basic Code, um die hypot_10x10 Tabelle zu erstellen.
Überflüssige Kommas müssen selbst entfernt werden.
Wer den MADS Assembler nutzt, muss wohl statt .byte etwas anderes schreiben.
LG
Lars
			Peter hatte AFAIK letztens erst eine flotte Methode ausgeknobelt für SQRT(a*a + b*b), um z.B. die genauere Entfernung zu messen.
Für Pacmen war ich faul und habe einfach abs(a)+abs(b) verwendet.
Für mein neuestes Projekt brauche ich es aber etwas genauer, soll ja besser aussehen. Allerdings ist mir Peters Methode viel zu langsam und meine x,y Werte sind recht klein (<=10)
Hier also mal meine Version von sqr(x*x + y*y), die Tabellen verwendet und damit sehr flott arbeitet. Kann auch als Idee verstanden werden, wie man so etwas machen könnte.
Code: Alles auswählen
; schnelle "Berechnung" von SQR(x*x + y*y)
; x und y dürfen von -10 bis +10 angegeben werden.
; ist x oder y zu groß(zu klein) wird $FF zurückgegeben.
reg=212 ; irgendeine freie zero-page Adresse.
FAST_HYPOT
 cpy #0
 bpl y_positiv
  sty reg
  SEC             ;Ensure carry is set
  LDA #0          ;Load constant zero
  SBC REG        ;... subtract the least significant byte
  TAY             ;... and store the result
y_positiv
 cpy #11
 bge fail        ; bge ist branch greater equal (bcs?)
 cpx #0
 bpl x_positiv
  stx reg
  SEC             ;Ensure carry is set
  LDA #0          ;Load constant zero
  SBC REG        ;... subtract the least significant byte
  TAX             ;... and store the result
x_positiv
 cpx #11
 bge fail
 clc
 txa
 adc hypot_mult_11,y
 tax
 ldy hypot_10x10,x
 ldx #0
 rts
fail
 ldy #$ff
 ldx #$00
 rts
hypot_mult_11
 .byte 0,11,22,33,44,55,66,77,88,99,110
hypot_10x10
 .byte 0,1,2,3,4,5,6,7,8,9,10
 .byte 1,1,2,3,4,5,6,7,8,9,10
 .byte 2,2,3,4,4,5,6,7,8,9,10
 .byte 3,3,4,4,5,6,7,8,9,9,10
 .byte 4,4,4,5,6,6,7,8,9,10,11
 .byte 5,5,5,6,6,7,8,9,9,10,11
 .byte 6,6,6,7,7,8,8,9,10,11,12
 .byte 7,7,7,8,8,9,9,10,11,11,12
 .byte 8,8,8,9,9,9,10,11,11,12,13
 .byte 9,9,9,9,10,10,11,11,12,13,13
 .byte 10,10,10,10,11,11,12,12,13,13,14
Code: Alles auswählen
 for x = 0 to 10
   for y = 0 to 10
     ?sqr(x*x + y*y);",";
   next y
   ?
 next x
Wer den MADS Assembler nutzt, muss wohl statt .byte etwas anderes schreiben.
LG
Lars
