mirror of
				https://github.com/irmen/prog8.git
				synced 2025-11-03 19:16:13 +00:00 
			
		
		
		
	fix monogfx.disc() inaccurracy
This commit is contained in:
		@@ -595,23 +595,12 @@ drawmode:               ora  cx16.r15L
 | 
				
			|||||||
            return
 | 
					            return
 | 
				
			||||||
        ubyte @zp yy = 0
 | 
					        ubyte @zp yy = 0
 | 
				
			||||||
        word @zp decisionOver2 = (1 as word)-radius
 | 
					        word @zp decisionOver2 = (1 as word)-radius
 | 
				
			||||||
        uword last_y3 = ycenter+radius
 | 
					 | 
				
			||||||
        uword last_y4 = ycenter-radius
 | 
					 | 
				
			||||||
        uword new_y3, new_y4
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while radius>=yy {
 | 
					        while radius>=yy {
 | 
				
			||||||
            horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
					            horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
				
			||||||
            horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
					            horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
				
			||||||
            new_y3 = ycenter+radius
 | 
					            horizontal_line(xcenter-yy, ycenter+radius, yy*$0002+1, draw)
 | 
				
			||||||
            if new_y3 != last_y3 {
 | 
					            horizontal_line(xcenter-yy, ycenter-radius, yy*$0002+1, draw)
 | 
				
			||||||
                horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y3 = new_y3
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            new_y4 = ycenter-radius
 | 
					 | 
				
			||||||
            if new_y4 != last_y4 {
 | 
					 | 
				
			||||||
                horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y4 = new_y4
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            yy++
 | 
					            yy++
 | 
				
			||||||
            if decisionOver2>=0 {
 | 
					            if decisionOver2>=0 {
 | 
				
			||||||
                radius--
 | 
					                radius--
 | 
				
			||||||
@@ -620,10 +609,6 @@ drawmode:               ora  cx16.r15L
 | 
				
			|||||||
            decisionOver2 += yy*$0002
 | 
					            decisionOver2 += yy*$0002
 | 
				
			||||||
            decisionOver2++
 | 
					            decisionOver2++
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ; draw the final two spans
 | 
					 | 
				
			||||||
        yy--
 | 
					 | 
				
			||||||
        horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
        horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sub safe_disc(uword @zp xcenter, uword @zp ycenter, ubyte @zp radius, bool draw) {
 | 
					    sub safe_disc(uword @zp xcenter, uword @zp ycenter, ubyte @zp radius, bool draw) {
 | 
				
			||||||
@@ -634,23 +619,12 @@ drawmode:               ora  cx16.r15L
 | 
				
			|||||||
            return
 | 
					            return
 | 
				
			||||||
        ubyte @zp yy = 0
 | 
					        ubyte @zp yy = 0
 | 
				
			||||||
        word @zp decisionOver2 = (1 as word)-radius
 | 
					        word @zp decisionOver2 = (1 as word)-radius
 | 
				
			||||||
        uword last_y3 = ycenter+radius
 | 
					 | 
				
			||||||
        uword last_y4 = ycenter-radius
 | 
					 | 
				
			||||||
        uword new_y3, new_y4
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while radius>=yy {
 | 
					        while radius>=yy {
 | 
				
			||||||
            safe_horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
					            safe_horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
				
			||||||
            safe_horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
					            safe_horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
				
			||||||
            new_y3 = ycenter+radius
 | 
					            safe_horizontal_line(xcenter-yy, ycenter+radius, yy*$0002+1, draw)
 | 
				
			||||||
            if new_y3 != last_y3 {
 | 
					            safe_horizontal_line(xcenter-yy, ycenter-radius, yy*$0002+1, draw)
 | 
				
			||||||
                safe_horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y3 = new_y3
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            new_y4 = ycenter-radius
 | 
					 | 
				
			||||||
            if new_y4 != last_y4 {
 | 
					 | 
				
			||||||
                safe_horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y4 = new_y4
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            yy++
 | 
					            yy++
 | 
				
			||||||
            if decisionOver2>=0 {
 | 
					            if decisionOver2>=0 {
 | 
				
			||||||
                radius--
 | 
					                radius--
 | 
				
			||||||
@@ -659,10 +633,6 @@ drawmode:               ora  cx16.r15L
 | 
				
			|||||||
            decisionOver2 += yy*$0002
 | 
					            decisionOver2 += yy*$0002
 | 
				
			||||||
            decisionOver2++
 | 
					            decisionOver2++
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ; draw the final two spans
 | 
					 | 
				
			||||||
        yy--
 | 
					 | 
				
			||||||
        safe_horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
        safe_horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sub plot(uword @zp xx, uword @zp yy, bool @zp draw) {
 | 
					    sub plot(uword @zp xx, uword @zp yy, bool @zp draw) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -302,23 +302,11 @@ monogfx {
 | 
				
			|||||||
            return
 | 
					            return
 | 
				
			||||||
        ubyte @zp yy = 0
 | 
					        ubyte @zp yy = 0
 | 
				
			||||||
        word @zp decisionOver2 = (1 as word)-radius
 | 
					        word @zp decisionOver2 = (1 as word)-radius
 | 
				
			||||||
        uword last_y3 = ycenter+radius
 | 
					 | 
				
			||||||
        uword last_y4 = ycenter-radius
 | 
					 | 
				
			||||||
        uword new_y3, new_y4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while radius>=yy {
 | 
					        while radius>=yy {
 | 
				
			||||||
            horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
					            horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
				
			||||||
            horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
					            horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
				
			||||||
            new_y3 = ycenter+radius
 | 
					            horizontal_line(xcenter-yy, ycenter+radius, yy*$0002+1, draw)
 | 
				
			||||||
            if new_y3 != last_y3 {
 | 
					            horizontal_line(xcenter-yy, ycenter-radius, yy*$0002+1, draw)
 | 
				
			||||||
                horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y3 = new_y3
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            new_y4 = ycenter-radius
 | 
					 | 
				
			||||||
            if new_y4 != last_y4 {
 | 
					 | 
				
			||||||
                horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y4 = new_y4
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            yy++
 | 
					            yy++
 | 
				
			||||||
            if decisionOver2>=0 {
 | 
					            if decisionOver2>=0 {
 | 
				
			||||||
                radius--
 | 
					                radius--
 | 
				
			||||||
@@ -327,10 +315,6 @@ monogfx {
 | 
				
			|||||||
            decisionOver2 += yy*$0002
 | 
					            decisionOver2 += yy*$0002
 | 
				
			||||||
            decisionOver2++
 | 
					            decisionOver2++
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ; draw the final two spans
 | 
					 | 
				
			||||||
        yy--
 | 
					 | 
				
			||||||
        horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
        horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sub safe_disc(uword @zp xcenter, uword @zp ycenter, ubyte @zp radius, bool draw) {
 | 
					    sub safe_disc(uword @zp xcenter, uword @zp ycenter, ubyte @zp radius, bool draw) {
 | 
				
			||||||
@@ -340,23 +324,11 @@ monogfx {
 | 
				
			|||||||
            return
 | 
					            return
 | 
				
			||||||
        ubyte @zp yy = 0
 | 
					        ubyte @zp yy = 0
 | 
				
			||||||
        word @zp decisionOver2 = (1 as word)-radius
 | 
					        word @zp decisionOver2 = (1 as word)-radius
 | 
				
			||||||
        uword last_y3 = ycenter+radius
 | 
					 | 
				
			||||||
        uword last_y4 = ycenter-radius
 | 
					 | 
				
			||||||
        uword new_y3, new_y4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while radius>=yy {
 | 
					        while radius>=yy {
 | 
				
			||||||
            safe_horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
					            safe_horizontal_line(xcenter-radius, ycenter+yy, radius*$0002+1, draw)
 | 
				
			||||||
            safe_horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
					            safe_horizontal_line(xcenter-radius, ycenter-yy, radius*$0002+1, draw)
 | 
				
			||||||
            new_y3 = ycenter+radius
 | 
					            safe_horizontal_line(xcenter-yy, ycenter+radius, yy*$0002+1, draw)
 | 
				
			||||||
            if new_y3 != last_y3 {
 | 
					            safe_horizontal_line(xcenter-yy, ycenter-radius, yy*$0002+1, draw)
 | 
				
			||||||
                safe_horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y3 = new_y3
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            new_y4 = ycenter-radius
 | 
					 | 
				
			||||||
            if new_y4 != last_y4 {
 | 
					 | 
				
			||||||
                safe_horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
                last_y4 = new_y4
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            yy++
 | 
					            yy++
 | 
				
			||||||
            if decisionOver2>=0 {
 | 
					            if decisionOver2>=0 {
 | 
				
			||||||
                radius--
 | 
					                radius--
 | 
				
			||||||
@@ -365,10 +337,6 @@ monogfx {
 | 
				
			|||||||
            decisionOver2 += yy*$0002
 | 
					            decisionOver2 += yy*$0002
 | 
				
			||||||
            decisionOver2++
 | 
					            decisionOver2++
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ; draw the final two spans
 | 
					 | 
				
			||||||
        yy--
 | 
					 | 
				
			||||||
        safe_horizontal_line(xcenter-yy, last_y3, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
        safe_horizontal_line(xcenter-yy, last_y4, yy*$0002+1, draw)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sub plot(uword @zp xx, uword @zp yy, bool @zp draw) {
 | 
					    sub plot(uword @zp xx, uword @zp yy, bool @zp draw) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ TODO
 | 
				
			|||||||
====
 | 
					====
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check the accuracy of the various disc routines (filled circles), they seem less accurate than the circle routine  (virt monogfx)
 | 
					check the accuracy of the various disc routines (filled circles), they seem less accurate than the circle routine  (virt monogfx)
 | 
				
			||||||
 | 
					check disc and circle draw in paint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LONG TYPE
 | 
					LONG TYPE
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,42 +1,16 @@
 | 
				
			|||||||
%import graphics
 | 
					%import monogfx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main {
 | 
					main {
 | 
				
			||||||
    sub start() {
 | 
					    sub start() {
 | 
				
			||||||
        graphics.enable_bitmap_mode()
 | 
					        monogfx.lores()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uword radius
 | 
					        uword radius
 | 
				
			||||||
        for radius in 1 to 10 {
 | 
					        for radius in 1 to 10 {
 | 
				
			||||||
            graphics.circle(30*radius, 100, lsb(radius))
 | 
					            monogfx.circle(30*radius, 100, lsb(radius), true)
 | 
				
			||||||
            graphics.disc(30*radius, 130, lsb(radius))
 | 
					            monogfx.disc(30*radius, 130, lsb(radius), true)
 | 
				
			||||||
            mydisc(30*radius, 160, lsb(radius))
 | 
					            monogfx.safe_disc(30*radius, 160, lsb(radius), true)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        repeat {}
 | 
					        repeat {}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    sub mydisc(uword xcenter, ubyte ycenter, ubyte radius) {
 | 
					 | 
				
			||||||
        ; Warning: NO BOUNDS CHECKS. Make sure circle fits in the screen.
 | 
					 | 
				
			||||||
        ; Midpoint algorithm.
 | 
					 | 
				
			||||||
        if radius==0
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        ubyte @zp ploty
 | 
					 | 
				
			||||||
        ubyte @zp yy = 0
 | 
					 | 
				
			||||||
        word @zp decisionOver2 = (1 as word)-radius
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while radius>=yy {
 | 
					 | 
				
			||||||
            graphics.horizontal_line(xcenter-radius, ycenter+yy, radius*2+1)
 | 
					 | 
				
			||||||
            graphics.horizontal_line(xcenter-radius, ycenter-yy, radius*2+1)
 | 
					 | 
				
			||||||
            graphics.horizontal_line(xcenter-yy, ycenter+radius, yy*2+1)
 | 
					 | 
				
			||||||
            graphics.horizontal_line(xcenter-yy, ycenter-radius, yy*2+1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            yy++
 | 
					 | 
				
			||||||
            if decisionOver2>=0 {
 | 
					 | 
				
			||||||
                radius--
 | 
					 | 
				
			||||||
                decisionOver2 -= radius*$0002
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            decisionOver2 += yy*$0002
 | 
					 | 
				
			||||||
            decisionOver2++
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user