News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

Shortest distance between points

Started by jj2007, June 29, 2020, 11:44:53 AM

Previous topic - Next topic

jj2007

Find the two points that are closest to each other - source & exe attached.


GuiParas equ "Shortest distance between points", x0, w1366, h740, b Black      ; position, size, background
include \masm32\MasmBasic\Res\MbGui.asm
  points=800                    ; 3ms (8,000: 330ms)
  SetGlobals px, py, minDist, pointA, pointB, hNull
  mov hNull, rv(GetStockObject, NULL_BRUSH)
  MakePath MyCircle, Circle(9)
  MakePen hPen1, RgbCol(255, 255, 255, 255)
  MakePen hPen2, RgbCol(96, 255, 255, 0), width 9      ; yellow, half transparent
  Dim pts() As POINT
Event Key
  GuiCls                                ; hit any key to generate a new set of points
Event Paint
  call MakePoints
  For_ ct=0 To points-1
        m2m px, pts(ct, x)
        m2m py, pts(ct, y)
        mov edx, ct
        If_ edx==pointA || edx==pointB Then GuiDraw MyCircle, hPen2, px, py, 8000
        GuiDraw MyCircle, hPen1, px, py
  Next
  GuiTextBox 99.9-100, 99.9-48, 96, 44, Cat$(Str$("A=%i", pts(pointA, x))+Str$(":%i", pts(pointA, y))+CrLf$+Str$("B=%i", pts(pointB, x))+Str$(":%i\n", pts(pointB, y))), bcol Yellow, font -14
EndOfEvents
MakePoints:
  mov minDist, 9999
  For_ ecx=0 To points-1
        mov pts(ecx, x), Rand(GuiWidth)
        mov pts(ecx, y), Rand(GuiHeight)
  Next
  For_ ct=0 To points-1
        m2m px, pts(ct, x)
        m2m py, pts(ct, y)
        For_ ecx=0 To points-1
                mov eax, pts(ecx, x)
                sub eax, px
                mul eax
                push eax
               mov eax, pts(ecx, y)
                sub eax, py
                mul eax
                pop edx
               add eax, edx
                .if eax<minDist
                                .if ct!=ecx
                                        mov pointB, ecx         ; remember this point
                                        m2m pointA, ct          ; remember the other one, too
                                        mov minDist, eax        ; and the distance, of course
                                .endif
                .endif
        Next
  Next
  ret
GuiEnd

jj2007

New version, optimised for speed (2ms for 1,000 points):
  For_ ct=0 To points-1
mrm px, pts(ct, x)
mrm py, pts(ct, y)
mov ecx, ct
.Repeat
inc ecx
mov eax, pts(ecx, x)
sub eax, px
mul eax
push eax
mov eax, pts(ecx, y)
sub eax, py
mul eax
pop edx
add eax, edx
.if eax<minDist && ct!=ecx
mov pointB, ecx ; remember this point
m2m pointA, ct ; remember the other one, too
mov minDist, eax ; and the distance, of course
.endif
.Until ecx>=points
  Next ; there is a retn 0 before the events