Hi!
I found an algorithm for a dotted line (https://saideepdicholkar.blogspot.com/2017/04/bresenhams-line-algorithm-dotted-line.html). And I thought the problem was solved, but not.
The author write loops: .while (x != x2)
but that work if you are lucky, other way you have an infinite loop.
The correct code is:.while (abs(x-x2)>2)
Here a code extended to other point separations (using ObjAsm for 32 and 64) tested in 32 bit:
if TARGET_BITNESS EQ 32
sxword textequ <sdword>
else
sxword textequ <sqword>
endif
Method Pixelmap2.DottedLine, uses xsi, x1:sxword,y1:sxword,x2:sxword,y2:sxword, espaciado:xword, dColor:xword
local x:sxword,y:sxword,dxx:sxword,dyy:sxword,i:sxword,e:sxword
local xinc:sxword,yinc:sxword
SetObject xsi
mov xax, x2
sub xax, x1
mov dxx, xax
mov xax, y2
sub xax, y1
mov dyy, xax
mov xax, x1
.if (xax < x2)
mov xinc , 1
.else
mov xinc , -1
.endif
mov xax, y1
.if (xax < y2)
mov yinc, 1
.else
mov yinc, -1
.endif
; Macros ------------------------------------------
salta macro var
mov xax , &var&inc
mov xcx , espaciado
imul xcx
add xax , &var
mov &var , xax
endm
proceso_dot macro v1, v2
mov xax, d&v2&&v2
mov xcx, espaciado
imul xcx
sub xax, d&v1&&v1
mov e, xax
;.while (eax != x2)
.while (xax > espaciado)
.if ( e < 0)
mov xax, d&v2&&v2
mov xcx, espaciado
imul xcx
add xax, e
mov e, xax
.else
mov xax, d&v2&&v2
sub xax, d&v1&&v1
mov xcx, espaciado
imul xcx
add xax, e
mov e, xax
salta &v2
.endif
salta &v1
OCall xsi.BlendPixel, x, y, dColor
; -----------------
mov xax , &v1
sub xax , &v1&2
cdq
xor xax , xdx
sub xax , xdx
.endw
endm
; Algorithm ------------------------------------------
m2m x, x1;
m2m y, y1;
mov xax, dxx
.if xax >= dyy
proceso_dot x, y
.else
proceso_dot y, x
.endif
MethodEnd
Look nice horizontal and vertical, but don't look well in angles.
I have to try other thing :eusa_boohoo:
Regards. HSE
.while (abs(x-x2)>2)
Beware of macro expansion before the .while - check in the debugger
Use instead:
.While 1
.Break .if abs(x-x2)<=2
...
.Endw
Yesterday I forget that for a moment :biggrin:
Now is: .while (xax > espaciado)
; -----------------
code here
; -----------------
mov xax , &v1 ; this is abs(x-x2)
sub xax , &v1&2
cdq
xor xax , xdx
sub xax , xdx
.endw