## CIRCLE Command that closes the openings document.SUBSCRIPTION_OPTIONS = { "thing": "thread", "subscribed": false, "url": "subscribe", "icon": { "css": "fa fa-envelope-o" } };

MBB
2014-04-13
2014-04-18
• MBB - 2014-04-13

On April 4th, I posted software that drew circles on a GLCD. In the software, I used the equation for a circle- x^2 + y^2 = Radius^2. In the first version I solved this equation for Y which produced a top and bottom half of a circle but left open areas along the left and right sides of the circle.

To fill in these areas I modified the software to solve for X. This produced a left half and a right half of a circle with openings at the top and bottom.

By combining these two solutions I filled in the circle openings. The new portion is the second FOR.... NEXT loop.

My GLCD is very noisy and prone to generating spurious pixels but I think this fix solves the problem. If anybody tries this please let me know what you find.

Here is the software.

```;Variables
Dim x_1, x_2, x_3, y_1, y_2, y_3, z_1, G_1 As integer

'

InitGLCD
GLCDCLS

'
'RADIUS is the radius of the circle - Must be <= 31 for 128x64 display
'OffsetX is the left most edge of the circle
'OffsetY is the top most edge of the circle
'
'Some examples using the CIRCLE command
'
Circle 16, 48, 15; Small circle with center in MIDDLE of display
Circle 10, 10, 10; Circle in TOP LEFT of display
Circle 10, 100, 10; Circle in TOP Right of display
Circle 10, 10, 40; Circle in BOTTOM LEFT of display
Circle 10, 100, 40; Circle in BOTTOM Right of display
Circle 32, 32, 0; Large circle with center in MIDDLE of display

'
'SUB ROUTINES ********************************************
'

Sub Circle (In Radius, In OffsetX, In OffsetY)
'For a 128x64 GLCD -
' Radius cannot exceed 63/2 = 31
' If 2xRadius plus OffsetX > 127, circle will move off right edge of screen
' If 2xRadius plus OffsetY > 63, circle will move off bottom edge of screen
' The below two IF statements address this situation by reducing OffsetX and/or OffsetY
If (2 * Radius + OffsetX) > 127 then
OffsetX = 127 - (2 * Radius)
end If

'
If (2 * Radius + OffsetY) > 63 then
OffsetY = 63 - (2 * Radius)
end If

'

'***********************************************************************
'Solve for y - this portions leaves openings on the SIDES the of the circle
' Combining with second FOR..NEXT section fills in the openings
'

'
Sq_Root y_1, G_1

'
x_2 = x_1 + Radius + OffSetX; x-axis
y_2 = G_1 + Radius + OffSetY; y-axis for bottom half of circle
y_3 = abs(G_1 - Radius) + OffSetY; y-axis for top half of circle

'
pset x_2,y_2,on; Bottom half of circle
pset x_2,y_3,on; Top half of circle

'
next

'********************************************************************
'Solve for x - this portions leaves openings on the TOP and BOTTOM of the circle
' Combining with first FOR..NEXT section fills in the openings
'

'
Sq_Root x_1, G_1

'
y_2 = z_1 + Radius + OffSetY; y-axis
x_2 = abs(G_1 - Radius) + OffSetX; x-axis for left half of circle
x_3 = G_1 + Radius + OffSetX; x-axis for right half of circle

'
pset x_2,y_2,on; Left half of circle
pset x_3,y_2,on; Right half of circle

'
next

'********************************************************************
'
End Sub

Sub Sq_root (In y_1, G_1)
'SQUARE ROOT Approximation &&&&&&&&&&&&&
'
G_1 = 200;First Guess for 5 Digit y_1
If y_1 < 10000 then
G_1 = 60;First Guess for 4 Digit y_1
End If
If y_1 < 1000 then
G_1 = 20;First Guess for 3 Digit y_1
End If
If y_1 < 100 then
G_1 = 6;First Guess for 2 Digit y_1
End If
If y_1 < 10 then
G_1 = 2;First Guess for 1 Digit y_1
End If

'
G_1 = (G_1 + (y_1 / G_1))/2
G_1 = (G_1 + (y_1 / G_1))/2
G_1 = (G_1 + (y_1 / G_1))/2
G_1 = (G_1 + (y_1 / G_1))/2;Square Root of y_1
End Sub
```

• Anobium - 2014-04-14

Let me finish the new GLCD driver I am writing and I can give this a go. Thank you.

• kent_twt4 - 2014-04-16

Attached a pic of the results from MBB's rev1 circle code. Definitely closed about the x axis now, but have a new set of problems to contend with. It would appear that several locations, in any particular quadrant, the algorithm cannot decide whether a pixel is to be inside, or outside, the circle radius. The smaller centered circle does appear very close.

Please don't take this as criticism, but only an observation. Keep up the good work :).

• MBB - 2014-04-17

Kent,

Thanks for trying this. What model display are you using. My display showed more closure on the circles than yours did.

I also noticed that the pixels appeared inside , on or outside the circle radius but I wasn't sure because my GLCD is very noisy and prone to producing spurious pixels. You confirmed its the algorithm unless your using the same display I am. I'm using a Hantronix HDM64GS12L-N31S display.

This algorithm problem could be in part due to the integer math in the software and the pixels being integer values

• kent_twt4 - 2014-04-17

My GLCD unit is from AZ Displays AGM1264F.

Have you instituted the fix for the Pset bug? If you Set GLCD_CS1, and GLCD_CS2 Off after GLCDCS then you should get rid of the random pixel(s).

The separation, or offset, in some quadrants seem to be related to the radius? Haven't actually tried to count the pixels. So, if you don't have the circle offset's seen in the previous post's pic, then maybe there is a code cut and paste error?

• kent_twt4 - 2014-04-18

MBB, I want to apologize to you as I did with Thomas Henry, I have had a hookup problem with the GLCD, with a couple of switched data lines. So previous posted picture is bogus, not your fault.

Corrected pic:

P.S. I've got some missing pixels on the right due to a toasted controller pin :).

Last edit: kent_twt4 2014-04-18