# Ellipse drawing algorithm

## Recommended Posts

Hi!

I'm trying to script an ellipse drawing algorithm in AutoIT for learning purposes.
I use an edit control to "draw" the ellipse with characters.

The code i have works kinda good but i would like to see if others around here know a better algorithm to do it..
I would like to be able to give the x, y and width, height arguments to the function and not have to start at the middle point and draw the ellipse around it.

side note, the ellipse glitches when it has to be 2 pixels high too..

```func ellipsePlotPoints (\$xc,\$yc, \$x,\$y)

pixel (\$xc + \$x, \$yc + \$y)
pixel (\$xc - \$x, \$yc + \$y)
pixel (\$xc + \$x, \$yc - \$y)
pixel (\$xc - \$x, \$yc - \$y)

endfunc

func ellipse(\$xc,\$yc, \$a,\$b)

local \$a2 = \$a * \$a
local \$b2 = \$b * \$b
local \$twoa2 = 2 * \$a2
local \$twob2 = 2 * \$b2
local \$p
local \$x = 0
local \$y = \$b
local \$px = 0
local \$py = \$twoa2 * \$y

; Plot the initial point in each quadrant.
ellipsePlotPoints (\$xc,\$yc, \$x,\$y)

; Region 1
\$p = int(\$b2 - (\$a2 * \$b) + (0.25 * \$a2))
while (\$px < \$py)
\$x+=1
\$px += \$twob2
if (\$p < 0) then
\$p += \$b2 + \$px
else
\$y-=1
\$py -= \$twoa2
\$p += \$b2 + \$px - \$py
endif
ellipsePlotPoints (\$xc,\$yc, \$x,\$y)
wend

; Region 2
\$p = int (\$b2 * (\$x+0.5) * (\$x+0.5) + \$a2 * (\$y-1) * (\$y-1) - \$a2 * \$b2)
while (\$y > 0)
\$y-=1
\$py -= \$twoa2
if (\$p > 0) then
\$p += \$a2 - \$py
else
\$x+=1
\$px += \$twob2
\$p += \$a2 - \$py + \$px
endif
ellipsePlotPoints (\$xc,\$yc, \$x,\$y)
wend

endfunc```

##### Share on other sites
3 minutes ago, junkew said:

don't need a function that hides the actual code that draws the ellipse
i need the code itself that puts the pixels where they are supposed to be

##### Share on other sites

here (https://www.autoitscript.com/forum/topic/181014-a-naive-question/?do=findComment&comment=1299979) you can find a simple implementation of the Bresenham's Algorithm, translated in AutoIt, to plot lines, circles, ellipses and Bézier curves plotted pixel by pixel (or character by character on a text box as well if you prefer)

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

##### Share on other sites

Chimp, Thanks so much, i'm gonna look in to that!
haha "a naive question"

##### Share on other sites

Would be nice to know how to fill the ellipse too btw

[edit:] if you draw an ellipse with your algorithm (w = 9, h = 4) then there are some pixels drawn twice..

Edited by TheAutomator

## Create an account

Register a new account

• ### Similar Content

• By v120
Original posted by CoePSX

Drawing_Script.au3
• By dejhost
Happy New Year everyone!
I would like to extract the color values of certain pixels in an image.  This is how I picture the workflow:
User opens an image of his choice. Image is shown on the screen. User draws a line into the image. This happens by marking the startpixel and the endpixel of the line The line is drawn, so the user can check visually if he is happy with the line.  The following pixel based properties belonging to the line are stored in Excel: X-Coordinate Y-Coordinate Color Value Additional operations: Extracting for max- and min. color values; Statistical operations.   Browsing through the helpfile of AutoIt I find plenty of functions for treating images (e.g. GDIPlus), but I am completely unsure if Autoit will get me there. Should I read the entire image into an array? Should I rather attempt to script an external image software (e.g. IrfanView, Gimp)?
I would be very thankful if someone could give some recommendations and maybe list a couple of the most important commands to use.
Thank you very much.
Dejhost

• Hey, All!

I was looking into the help file at all the drawing utilities and I was wondering if you draw a translucent line that follows your cursor. Upon looking for ideas I came across this thread (1.0) and saw UEZ's response. I also came across another post that UEZ replied to and found this reply (1.1) where he shows how you can draw on the desktop. This is what I'm looking for however I'd still like to be able to interact with a designated application and have the line/curve/vector passively follow it. Obviously we don't move our cursor very linearly so it would have to be able to draw on vectors. Am I over complicating this?
Any ideas or starting points I should look more into?

1.0
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Global Const \$aFullScreen = WinGetPos(WinGetHandle("[TITLE:Program Manager;CLASS:Progman]")) Global \$iHeight = 4 Global Const \$hGUI = GUICreate("Screen Ruler Underline for free :-)", \$aFullScreen[2], \$iHeight, \$aFullScreen[0], MouseGetPos(1), \$WS_POPUP, BitOR(\$WS_EX_TOPMOST, \$WS_EX_TRANSPARENT)) GUISetBkColor(0x000000) WinSetTrans(\$hGUI, "", 0xA0) GUISetState() HotKeySet("{ESC}", "_Exit") Do WinMove(\$hGUI, "", \$aFullScreen[0], MouseGetPos(1)) Until Not Sleep(50) Func _Exit() GUIDelete() Exit EndFunc _____________
1.1
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> AutoItSetOption("GUIOnEventMode", 1) Global \$hGUI, \$hDC, \$hPen, \$obj_orig \$hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, \$WS_POPUP) WinSetTrans(\$hGUI, "", 1) GUISetState() _line() Func _line() \$hDC = _WinAPI_GetWindowDC(0) ; DC of entire screen (desktop) \$hPen = _WinAPI_CreatePen(\$PS_SOLID, 2, 0x00ff) \$obj_orig = _WinAPI_SelectObject(\$hDC, \$hPen) GUISetOnEvent(\$GUI_EVENT_PRIMARYDOWN, "Draw", \$hGUI) GUISetOnEvent(-3, "_Exit") Do Until Not Sleep(1000) EndFunc ;==>_line Func Draw() Local \$aMC, \$mxo, \$myo \$aMC = GUIGetCursorInfo(\$hGUI) Do GUISetCursor(0, 1, 0) \$mxo = \$aMC[0] \$myo = \$aMC[1] \$aMC = GUIGetCursorInfo(\$hGUI) If \$mxo <> \$aMC[0] Or \$myo <> \$aMC[1] Then _WinAPI_DrawLine(\$hDC, \$aMC[0], \$aMC[1], \$mxo, \$myo) _WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, \$RDW_INVALIDATE) \$mxo = \$aMC[0] \$myo = \$aMC[1] EndIf Sleep(10) Until Not \$aMC[2] EndFunc Func _Exit() _WinAPI_SelectObject(\$hDC, \$obj_orig) _WinAPI_DeleteObject(\$hPen) _WinAPI_ReleaseDC(0, \$hDC) Exit EndFunc

• AutoIt Machine Code Algorithm Collection
By Ward, November 11, 2010 in AutoIt Example Scripts
Posted November 11, 2010 (edited) I have already published a lot of AutoIt UDF about algorithm, but all of them only support 32 bits or so called X86 system. Recently I got a computer with Windows 7 64 bits, so I finally added X64 support to most of my old projects. Besides, I also added some new. For example, some compression algorithm and SHA3 Candidates.
Following are the algorithms list:
Checksum   CRC16   CRC32   ADLER32 Compression   FastLZ   LZF   LZMA   LZMAT   MiniLZO   QuickLZ Encode   Base64   ARC4   XXTEA   DES   AES Hash   Checksums (CRC16/CRC32/ADLER32)   MD2   MD4   MD5   SHA1   SHA2 (SHA224/256/384/512)   SHA3 Candidates     BLAKE     BMW (Blue Midnight Wish)     CUBEHASH     ECHO     SHABAL     SKEIN Some points to mention:
All of the subroutines have one or more examples to demonstrate the usage. Since the function and usage of subroutine are easy to understand. A complete subroutines and parameters list are unavailability now. Sorry for my lazy. All of the subroutines here invoked by Lazycat's method (through CallWindowProc API). My MemoryDLL UDF is not necessary this time. Although MemoryFuncCall (part of MemoryDLL) is still good, but inevitably, it is slower than CallWindowProc. Some subroutines have the same name with my old machine code version UDF. But for some reason, I rearrange the position of the parameters. Please not mix up. If you notice, yes, checksums are duplicated. But they receive different parameters. One is the old style, and another use the same interface as other hashes. Choose what you like, but don't use them in the same time. Some algorithm already supported by the standard UDF "Encryption.au3". But I still provide them, because some system lack of the full support of Windows Crypt Library. If you are looking for only one hash algorithm, for example, used in encryption, I suggested "SHABAL_TINY.au3". Although it is a bit slower then SHABAL, but it is smaller, and it supports different size of output (from 32 to 512 bits).
• By tiye0405
Hello,

I currently have a problem that deals with moving the mouse to a given location + or - a certain distance.
\$search1 =_WaitForImageSearch("envelope.bmp", 10, 1, \$x, \$y, 20)
\$search2 =_WaitForImageSearch("envelope2.bmp", 10, 1, \$x, \$y, 20)

If \$search1 = 1 Then
Sleep(100)
MouseMove(\$x, \$y, 10)
sleep(99)
MouseClick("left")
Sleep(99)
ElseIf \$search2 = 1 Then
Sleep(100)
MouseMove(\$x, \$y2, 10)
sleep(99)
MouseClick("left")
Sleep(100)
Else
Sleep(150)
MouseMove(\$x2, \$y, 10)
Sleep(150)
MouseClick("left")
Sleep(150)
EndIf
The problem about this is that i defined \$x2 = \$x - 175  and \$y2 = \$y + 35
I got these numbers ( 175 and 35) with the autoit helper and just subtracted point where it is to the point its supposed to move but it doesnt work.

is there any proper way to find the distance between 2 points in pixels?

Imgsearch doesnt always work for this picture so i want it to have a backup

edit: could it be that the definition of \$x and \$y  from the previous image search arent there anymore and thats why it moves my mouse to strange places?
is there a way to preserve the \$x \$y from the previous img search untill the next succesful one?

×

• Wiki

• Back

• #### Beta

• Git
• FAQ
• Our Picks
×
• Create New...