# Finding nearest neighbours in two overlapping 2D distributions

```'   nomainwin

randomize( 0.666)  '   seed PRNGenerator

WindowWidth  =600
WindowHeight =600

'                                       Generate two data sets to play with....
s1 =1000 '1000
s2 =50000 '50000

dim dataSet1\$( s1)    '   string holds x y and z as csv string
dim dataSet2\$( s2)
dim dataSet3\$( s1)    '   will add the closest from set2 to set1

open "Display" for graphics_nsb_nf as #wg

#wg "trapclose [quit]"
#wg "down ; fill 50 50 50 ; size 4"
#wg "up ; goto 50 20 ; down"
#wg "\"; time\$()
'                                       Show them on screen....
#wg "color red"
for i =1 to s1
x =50 +int( 400 *rnd( 1)): y =50 +int( 400 *rnd( 1)): z =int( 256 *rnd( 1))
dataSet1\$( i) =str\$( x) +"," +str\$( y) +"," +str\$( z)
#wg "set "; 50 +x; " ";50 +y
scan
next i

#wg "color green ; size 1"
for i =1 to s2
x =int( 500 *rnd( 1)): y =int( 500 *rnd( 1)): z =int( 256 *rnd( 1))
dataSet2\$( i) =str\$( x) +"," +str\$( y) +"," +str\$( z)
#wg "set "; 50 +x; " "; 50 +y
scan
next i

#wg "flush ; getbmp scr 1 1 600 600"
bmpsave "scr", "unselected2.bmp"

'                                                   Go through all data in set1 and find closest in set2
for i =1 to s1
sepnSqd =1E12
Jn       =0
for j =1 to s2
dX =val( word\$( dataSet1\$( i), 1, ",")) -val( word\$( dataSet2\$( j), 1, ","))
dY =val( word\$( dataSet1\$( i), 2, ",")) -val( word\$( dataSet2\$( j), 2, ","))
dSqd =dX^2 +dY^2
if dSqd <sepnSqd then sepnSqd =dSqd: Jn =j   '   Jn ends pointing to closest in set 2
next j
'                                               Create new dataset3
dataSet3\$( i) =dataSet1\$( i) +"," +dataSet2\$( Jn)
next i

'                                                   Clear screen and show only set1 and nearest neighbours
#wg "fill darkblue"
#wg "rule XOR"

for i =1 to s1
print dataSet3\$( i)
xS =int( val( word\$( dataSet3\$( i), 1, ",")))
yS =int( val( word\$( dataSet3\$( i), 2, ",")))
#wg "size 4 ; color red  ; set "; 50 +xS; " "; 50 +yS

xS =int( val( word\$( dataSet3\$( i), 4, ",")))
yS =int( val( word\$( dataSet3\$( i), 5, ",")))
#wg "size 4 ; color green ; set "; 50 +xS; " "; 50 +yS
scan
next i

#wg "up ; goto 50 20 ; down"
#wg "\"; time\$()
#wg "flush ; getbmp scr 1 1 600 600"
bmpsave "scr", "selected2.bmp"

wait

[quit]
close #wg
end

```