Voronoi diagram: Difference between revisions

Added Easylang
(Added Easylang)
 
(14 intermediate revisions by 9 users not shown)
Line 14:
=={{header|AutoHotkey}}==
Requires [https://www.autohotkey.com/boards/viewtopic.php?f=6&t=6517 GDIP Library]
<langsyntaxhighlight AutoHotkeylang="autohotkey">;------------------------------------------------------------------------
Gui, 1: +E0x20 +Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui, 1: Show, NA
Line 91:
ExitApp
Return
;------------------------------------------------------------------------</langsyntaxhighlight>
 
 
=={{header|BASIC256}}==
{{trans|Python}}
<syntaxhighlight lang="basic256">global ancho, alto
ancho = 500 : alto = 500
 
clg
graphsize ancho, alto
 
function hypot(a, b)
return sqr(a^2+b^2)
end function
 
subroutine Generar_diagrama_Voronoi(ancho, alto, num_celdas)
dim nx(num_celdas+1)
dim ny(num_celdas+1)
dim nr(num_celdas+1)
dim ng(num_celdas+1)
dim nb(num_celdas+1)
 
for i = 0 to num_celdas
nx[i] = int(rand * ancho)
ny[i] = int(rand * alto)
nr[i] = int(rand * 256) + 1
ng[i] = int(rand * 256) + 1
nb[i] = int(rand * 256) + 1
next i
for y = 1 to alto
for x = 1 to ancho
dmin = hypot(ancho-1, alto-1)
j = -1
for i = 1 to num_celdas
d = hypot(nx[i]-x, ny[i]-y)
if d < dmin then dmin = d : j = i
next i
color rgb(nr[j], ng[j], nb[j])
plot (x, y)
next x
next y
end subroutine
 
call Generar_diagrama_Voronoi(ancho, alto, 25)
refresh
imgsave "Voronoi_diagram.jpg", "jpg"
end</syntaxhighlight>
 
 
=={{header|C}}==
Line 98 ⟶ 145:
Image is in PNM P6, written to stdout.
Run as <code>a.out > stuff.pnm</code>.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 216 ⟶ 263:
gen_map();
return 0;
}</langsyntaxhighlight>
 
=={{header|C++}}==
[[File:voronoi_cpp.png|256px]]
<langsyntaxhighlight lang="cpp">
#include <windows.h>
#include <vector>
Line 412 ⟶ 459:
return 0;
}
</syntaxhighlight>
</lang>
 
=={{header|D}}==
{{trans|Go}}
<langsyntaxhighlight lang="d">import std.random, std.algorithm, std.range, bitmap;
 
struct Point { uint x, y; }
Line 456 ⟶ 503:
.generateVoronoi(imageWidth, imageHeight)
.savePPM6("voronoi.ppm");
}</langsyntaxhighlight>
 
=={{header|Delphi}}==
<langsyntaxhighlight lang="delphi">
uses System.Generics.Collections;
Line 567 ⟶ 614:
Canvas.Draw(0,0, img);
end;
</syntaxhighlight>
 
 
</lang>
=={{header|EasyLang}}==
[https://easylang.dev/show/#cod=fZBBboMwFET3PsVbVZAqjl2JXTlJxAIMqJYS0xqngttXtqlo2qgb+H4zns8w3pzhbX2faOmQAvBDuHnH/OEDRcuBlmc6DnSlkMLNNgwzNS+VGCePJUxkGC+75dzwVONb11sX0Eppjuikrf9o5o+mkibTlpUaFTdFHv0RLr8h0F+to0Zz4hs9+MrNS52rF24524YjS0nh1jyv5e60Iz2vKXyH+7b+DtoM7Q6luH+b6TL5WDlamw1ep8+BhRM6FldSVaw/T5vNDyagpNbpIVKqFDkx/oYHbVNyrpjycsM4RtVYby4DSlZCii8= Run it]
 
{{trans|BASIC256}}
<syntaxhighlight>
func hypo a b .
return sqrt (a * a + b * b)
.
nsites = 25
for i to nsites
nx[] &= randint 1001 - 1
ny[] &= randint 1001 - 1
nc[] &= randint 1000 - 1
.
for y = 0 to 1000
for x = 0 to 1000
dmin = 1 / 0
for i to nsites
d = hypo (nx[i] - x) (ny[i] - y)
if d < dmin
dmin = d
imin = i
.
.
color nc[imin]
move x / 10 - 0.05 y / 10 - 0.05
rect 0.11 0.11
.
.
color 000
for i to nsites
move nx[i] / 10 ny[i] / 10
circle 0.5
.
</syntaxhighlight>
 
=={{header|FreeBASIC}}==
{{trans|Python}}
<syntaxhighlight lang="freebasic">Dim Shared As Integer ancho = 500, alto = 500
Screenres ancho, alto, 8
Cls
Randomize Timer
 
Function hypot(a As Integer, b As Integer) As Double
Return Sqr(a^2 + b^2)
End Function
 
Sub Generar_Diagrama_Voronoi(ancho As Integer, alto As Integer, num_celdas As Integer)
Dim As Integer nx(num_celdas), ny(num_celdas), nr(num_celdas), ng(num_celdas), nb(num_celdas)
Dim As Integer x, i, y, j, dmin, d
For i = 1 To num_celdas
nx(i) = (Rnd * ancho)
ny(i) = (Rnd * alto)
nr(i) = (Rnd * 256)
ng(i) = (Rnd * 256)
nb(i) = (Rnd * 256)
Next i
For y = 1 To alto
For x = 1 To ancho
dmin = hypot(ancho-1, alto-1)
j = -1
For i = 1 To num_celdas
d = hypot(nx(i)-x, ny(i)-y)
If d < dmin Then dmin = d : j = i
Next i
Pset (x, y), Rgb(nr(j), ng(j), ng(j))
Next x
Next y
End Sub
 
Generar_Diagrama_Voronoi(ancho, alto, 25)
Bsave "Voronoi_diadram.bmp",0
Sleep</syntaxhighlight>
 
=={{header|Go}}==
[[file:GoVoronoi.png|thumb|right|Output png]]
<langsyntaxhighlight lang="go">package main
 
import (
Line 654 ⟶ 776:
fmt.Println(err)
}
}</langsyntaxhighlight>
 
=={{header|Haskell}}==
Uses the repa and repa-io libraries.
<langsyntaxhighlight lang="haskell">
-- Compile with: ghc -O2 -fllvm -fforce-recomp -threaded --make
{-# LANGUAGE BangPatterns #-}
Line 720 ⟶ 842:
writeImageToBMP "out.bmp" voro
 
</syntaxhighlight>
</lang>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 726 ⟶ 848:
[[File:Voronoi-normal_unicon.PNG|right]]
[[File:Voronoi-taxi_unicon.PNG|right]]
<langsyntaxhighlight Iconlang="icon">link graphics,printf,strings
 
record site(x,y,colour) # site data position and colour
Line 796 ⟶ 918:
every site := !siteL do # mark sites
DrawCircle(site.x,site.y,1)
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 808 ⟶ 930:
 
A straightforward solution: generate random points and for each pixel find the index of the least distance. Note that the square root is avoided to improve performance.
<langsyntaxhighlight lang="j">NB. (number of points) voronoi (shape)
NB. Generates an array of indices of the nearest point
voronoi =: 4 :0
Line 816 ⟶ 938:
 
load'viewmat'
viewmat 25 voronoi 500 500</langsyntaxhighlight>
 
Another solution generates Voronoi cells from Delaunay triangulation. The page [[Voronoi diagram/J/Delaunay triangulation]] also contains a convex hull algorithm. This is a vector based approach instead of a pixel based approach and is about twice as fast for this task's example.
Line 824 ⟶ 946:
This a direct reformulation of the explicit version.
 
<langsyntaxhighlight lang="j">Voronoi=. ,"0/&i./@:] (i. <./)@:(+/@:*:@:-"1)"1 _ ] ?@$~ 2 ,~ [
viewmat 25 Voronoi 500 500 [ load'viewmat'</langsyntaxhighlight>
 
=={{header|Java}}==
{{libheader|Swing}} {{libheader|AWT}}
<langsyntaxhighlight lang="java">import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
Line 906 ⟶ 1,028:
}
}
</syntaxhighlight>
</lang>
 
=={{header|JavaScript}}==
Line 932 ⟶ 1,054:
[[File:VDjs310.png|200px|right|thumb|Output VDjs310.png]]
 
<syntaxhighlight lang="javascript"><!-- VoronoiD.html -->
<lang html>
<!-- VoronoiD.html -->
<html>
<head><title>Voronoi diagram</title>
Line 995 ⟶ 1,116:
</body>
</html>
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Line 1,004 ⟶ 1,125:
=={{header|Julia}}==
First version generates an image with random colors as centroids for the voronoi tesselation:
<langsyntaxhighlight lang="julia">
using Images
function voronoi(w, h, n_centroids)
Line 1,018 ⟶ 1,139:
end
img = voronoi(800, 600, 200)
</syntaxhighlight>
</lang>
 
Second version takes an image as an input, samples random centroids for the voronoi cells, and asignes every pixel within that cell the color of the centroid:
 
<langsyntaxhighlight lang="julia">
using TestImages, Images
function voronoi_img!(img, n_centroids)
Line 1,044 ⟶ 1,165:
img = testimage("mandrill")
voronoi_img!(img, 300)
</syntaxhighlight>
</lang>
 
=={{header|Kotlin}}==
{{trans|Java}}
<langsyntaxhighlight lang="scala">// version 1.1.3
 
import java.awt.Color
Line 1,098 ⟶ 1,219:
fun main(args: Array<String>) {
Voronoi(70, 700).isVisible = true
}</langsyntaxhighlight>
 
=={{header|Liberty BASIC}}==
Line 1,105 ⟶ 1,226:
If no place on a vertical line is closer to the current site, then there's no point looking further left or right.
Don't bother square-rooting to get distances..
<syntaxhighlight lang="lb">
<lang lb>
WindowWidth =600
WindowHeight =600
Line 1,197 ⟶ 1,318:
next y
end function
</syntaxhighlight>
</lang>
 
=={{header|Lua}}==
Line 1,203 ⟶ 1,324:
{{works with|LÖVE|11.3}}
{{trans|Python}}
<langsyntaxhighlight lang="lua">
function love.load( )
love.math.setRandomSeed( os.time( ) ) --set the random seed
Line 1,281 ⟶ 1,402:
end
end
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">Needs["ComputationalGeometry`"]
DiagramPlot[{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9}, {13.2, 11.9}, {10.3, 12.3},
{6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4}, {8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}]</langsyntaxhighlight>
[[File:mma_voronoi.png|Right]]
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">0 П4
0 П5
ИП0 1 - x^2 ИП1 1 - x^2 + КвКор П3
Line 1,300 ⟶ 1,421:
КИП7 [x] С/П
КИП5 ИП5 ИП1 - x>=0 04
КИП4 ИП4 ИП0 - x>=0 02</langsyntaxhighlight>
 
''Input'': Р0 - diagram width; Р1 - diagram height; Р0 - number of the points; РA - РE - coordinates and colors of the points in format ''C,XXYY'' (example: 3,0102).
Line 1,332 ⟶ 1,453:
{{works with|nim|0.19.4}}
{{libheader|nim-libgd}}
<langsyntaxhighlight lang="nim">
from sequtils import newSeqWith
from random import rand, randomize
Line 1,386 ⟶ 1,507:
 
main()
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
{{works with|ocaml|4.07.1}}
 
<langsyntaxhighlight lang="ocaml">let n_sites = 220
let size_x = 640
Line 1,450 ⟶ 1,571:
rand_int_range 20 140))
in
gen_map ~site ~rgb</langsyntaxhighlight>
 
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use Imager;
Line 1,507 ⟶ 1,628:
}
}
}</langsyntaxhighlight>
[https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/voronoi-Euclidean.png Euclidean Voronoi diagram] (offsite image)
 
Line 1,513 ⟶ 1,634:
{{trans|Liberty_BASIC}}
{{libheader|Phix/pGUI}}
{{libheader|Phix/online}}
Lifted the calculation strategy from Liberty Basic.
Lifted the calculation strategy from Liberty Basic. <br>
Can resize, double or halve sites (press +/-), and toggle between Euclid, Manhattan, and Minkowski (press e/m/w).
You can run this online [http://phix.x10.mx/p2js/voronoi.htm here] (it' a bit slow tho).
<lang Phix>--
<!--<syntaxhighlight lang="phix">(phixonline)-->
-- demo\rosetta\VoronoiDiagram.exw
<span style="color: #000080;font-style:italic;">--
--
-- demo\rosetta\VoronoiDiagram.exw
include pGUI.e
-- ===============================
 
--
Ihandle dlg, canvas, timer
-- Can resize, double or halve the number of sites (press +/-), and toggle
cdCanvas cddbuffer, cdcanvas
-- between Euclid, Manhattan, and Minkowski (press e/m/w).
 
--</span>
-- Stop any current drawing process before starting a new one:
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
-- Without this it /is/ going to crash, if it tries to finish
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
-- drawing all 100 sites, when there are now only 50, for eg.
integer timer_active = 0
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">timer</span>
 
<span style="color: #004080;">cdCanvas</span> <span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span>
integer nsites = 200
integer last_width = -1, last_height
<span style="color: #000080;font-style:italic;">-- Stop any current drawing process before starting a new one:
sequence siteX, siteY, siteC
-- Without this it /is/ going to crash, if it tries to finish
 
-- drawing all 100 sites, when there are now only 50, for eg.</span>
enum EUCLID, MANHATTAN, MINKOWSKI
<span style="color: #004080;">integer</span> <span style="color: #000000;">timer_active</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
 
constant dmodes = {"Euclid", "Manhattan", "Minkowski"}
<span style="color: #004080;">integer</span> <span style="color: #000000;">nsites</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">200</span>
 
<span style="color: #004080;">integer</span> <span style="color: #000000;">last_width</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">last_height</span>
integer dmode = EUCLID,
<span style="color: #004080;">sequence</span> <span style="color: #000000;">siteX</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">siteY</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">siteC</span>
drawn = 0 -- (last dmode actually shown)
 
<span style="color: #008080;">enum</span> <span style="color: #000000;">EUCLID</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">MANHATTAN</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">MINKOWSKI</span>
function distance(integer x1,y1, x2,y2)
atom d
<span style="color: #008080;">constant</span> <span style="color: #000000;">dmodes</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Euclid"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Manhattan"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Minkowski"</span><span style="color: #0000FF;">}</span>
x1 -= x2
y1 -= y2
<span style="color: #004080;">integer</span> <span style="color: #000000;">dmode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">EUCLID</span><span style="color: #0000FF;">,</span>
switch dmode do
<span style="color: #000000;">drawn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- (last dmode actually shown)</span>
case EUCLID: d = x1*x1+y1*y1 -- (no need for sqrt)
case MANHATTAN: d = abs(x1)+abs(y1)
<span style="color: #008080;">function</span> <span style="color: #000000;">distance</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">y1</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">y2</span><span style="color: #0000FF;">)</span>
case MINKOWSKI: d = power(abs(x1),3)+power(abs(y1),3) -- ("" power(d,1/3))
<span style="color: #004080;">atom</span> <span style="color: #000000;">d</span>
end switch
<span style="color: #000000;">x1</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">x2</span>
return d
<span style="color: #000000;">y1</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">y2</span>
end function
<span style="color: #008080;">switch</span> <span style="color: #000000;">dmode</span> <span style="color: #008080;">do</span>
 
<span style="color: #008080;">case</span> <span style="color: #000000;">EUCLID</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">+</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">y1</span> <span style="color: #000080;font-style:italic;">-- (no need for sqrt)</span>
sequence nearestIndex, dist
<span style="color: #008080;">case</span> <span style="color: #000000;">MANHATTAN</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">)+</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">)</span>
 
<span style="color: #008080;">case</span> <span style="color: #000000;">MINKOWSKI</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)+</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- ("" power(d,1/3))</span>
function checkRow(integer site, integer x, integer height)
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
bool res = false
<span style="color: #008080;">return</span> <span style="color: #000000;">d</span>
atom dxSquared
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
integer x1 = siteX[site]-x
switch dmode do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">nearestIndex</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">dist</span>
case EUCLID: dxSquared = x1*x1
case MANHATTAN: dxSquared = abs(x1)
<span style="color: #008080;">function</span> <span style="color: #000000;">checkRow</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">site</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">)</span>
case MINKOWSKI: dxSquared = power(abs(x1),3)
<span style="color: #004080;">bool</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
end switch
<span style="color: #004080;">atom</span> <span style="color: #000000;">dxSquared</span>
for y=1 to height do
<span style="color: #004080;">integer</span> <span style="color: #000000;">x1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">siteX</span><span style="color: #0000FF;">[</span><span style="color: #000000;">site</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">x</span>
-- atom dSquared = distance(siteX[site],siteY[site],x,y) -- (sub-optimal..)
<span style="color: #008080;">switch</span> <span style="color: #000000;">dmode</span> <span style="color: #008080;">do</span>
atom dSquared
<span style="color: #008080;">case</span> <span style="color: #000000;">EUCLID</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dxSquared</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">x1</span>
integer y1 = siteY[site]-y
<span style="color: #008080;">case</span> <span style="color: #000000;">MANHATTAN</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dxSquared</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">)</span>
switch dmode do
<span style="color: #008080;">case</span> <span style="color: #000000;">MINKOWSKI</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dxSquared</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span>
case EUCLID: dSquared = dxSquared + y1*y1
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
case MANHATTAN: dSquared = dxSquared + abs(y1)
<span style="color: #008080;">for</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">height</span> <span style="color: #008080;">do</span>
case MINKOWSKI: dSquared = dxSquared + power(abs(y1),3)
<span style="color: #000080;font-style:italic;">-- atom dSquared = distance(siteX[site],siteY[site],x,y) -- (sub-optimal..)</span>
end switch
<span style="color: #004080;">atom</span> <span style="color: #000000;">dSquared</span>
if dSquared<=dist[x,y] then
<span style="color: #004080;">integer</span> <span style="color: #000000;">y1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">siteY</span><span style="color: #0000FF;">[</span><span style="color: #000000;">site</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">y</span>
dist[x,y] = dSquared
<span style="color: #008080;">switch</span> <span style="color: #000000;">dmode</span> <span style="color: #008080;">do</span>
nearestIndex[x,y] = site
<span style="color: #008080;">case</span> <span style="color: #000000;">EUCLID</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dSquared</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dxSquared</span><span style="color: #0000FF;">+</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">y1</span>
res = true
<span style="color: #008080;">case</span> <span style="color: #000000;">MANHATTAN</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dSquared</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dxSquared</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">case</span> <span style="color: #000000;">MINKOWSKI</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dSquared</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dxSquared</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
return res
<span style="color: #008080;">if</span> <span style="color: #000000;">dSquared</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">dist</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
end function
<span style="color: #000000;">dist</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dSquared</span>
 
<span style="color: #000000;">nearestIndex</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">site</span>
function redraw_cb(Ihandle /*ih*/, integer /*posx*/, integer /*posy*/)
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
integer {width, height} = IupGetIntInt(canvas, "DRAWSIZE")
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if width!=last_width
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
or height!=last_height
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
or nsites!=length(siteX) then
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
if nsites<1 then nsites = 1 end if
siteX = sq_rand(repeat(width,nsites))
<span style="color: #008080;">function</span> <span style="color: #000000;">redraw_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
siteY = sq_rand(repeat(height,nsites))
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">width</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetIntInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DRAWSIZE"</span><span style="color: #0000FF;">)</span>
siteC = sq_rand(repeat(#FFFFFF,nsites))
<span style="color: #008080;">if</span> <span style="color: #000000;">width</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">last_width</span>
last_width = width
<span style="color: #008080;">or</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">last_height</span>
last_height = height
<span style="color: #008080;">or</span> <span style="color: #000000;">nsites</span><span style="color: #0000FF;">!=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">siteX</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
drawn = 0
<span style="color: #008080;">if</span> <span style="color: #000000;">nsites</span><span style="color: #0000FF;"><</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">nsites</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #000000;">siteX</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_rand</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">width</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nsites</span><span style="color: #0000FF;">))</span>
if drawn!=dmode -- (prevent double-draw, and)
<span style="color: #000000;">siteY</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_rand</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">height</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nsites</span><span style="color: #0000FF;">))</span>
and not timer_active then -- (drawing when rug moved..)
<span style="color: #000000;">siteC</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_rand</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">#FFFFFF</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nsites</span><span style="color: #0000FF;">))</span>
drawn = dmode
<span style="color: #000000;">last_width</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">width</span>
cdCanvasActivate(cddbuffer)
<span style="color: #000000;">last_height</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">height</span>
atom t0 = time(), t1
<span style="color: #000000;">drawn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
t1 = time()+0.25
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
nearestIndex = repeat(repeat(1,height),width)
<span style="color: #008080;">if</span> <span style="color: #000000;">drawn</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">dmode</span> <span style="color: #000080;font-style:italic;">-- (prevent double-draw, and)</span>
dist = repeat(repeat(0,height),width)
<span style="color: #008080;">and</span> <span style="color: #008080;">not</span> <span style="color: #000000;">timer_active</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (drawing when rug moved..)</span>
-- fill distance table with distances from the first site
<span style="color: #000000;">drawn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dmode</span>
integer x1 = siteX[1], y1 = siteY[1]
<span style="color: #7060A8;">cdCanvasActivate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
for x=1 to width do
<span style="color: #7060A8;">cdCanvasClear</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
for y=1 to height do
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">(),</span> <span style="color: #000000;">t1</span>
dist[x,y] = distance(x1,y1,x,y)
<span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()+</span><span style="color: #000000;">0.25</span>
end for
<span style="color: #000000;">nearestIndex</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">height</span><span style="color: #0000FF;">),</span><span style="color: #000000;">width</span><span style="color: #0000FF;">)</span>
if timer_active then exit end if
<span style="color: #000000;">dist</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">height</span><span style="color: #0000FF;">),</span><span style="color: #000000;">width</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #000080;font-style:italic;">-- fill distance table with distances from the first site</span>
--for other towns
<span style="color: #004080;">integer</span> <span style="color: #000000;">x1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">siteX</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">y1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">siteY</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
for i=2 to nsites do
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">width</span> <span style="color: #008080;">do</span>
-- look left
<span style="color: #008080;">for</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">height</span> <span style="color: #008080;">do</span>
for x=siteX[i] to 1 by -1 do
<span style="color: #000000;">dist</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">distance</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
if not checkRow(i, x, height) then exit end if
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">timer_active</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
-- look right
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for x=siteX[i]+1 to width do
<span style="color: #000080;font-style:italic;">--for other towns</span>
if not checkRow(i, x, height) then exit end if
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">nsites</span> <span style="color: #008080;">do</span>
end for
<span style="color: #000080;font-style:italic;">-- look left</span>
if timer_active then exit end if
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=</span><span style="color: #000000;">siteX</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
if time()>t1 then
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">checkRow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
IupSetStrAttribute(dlg, "TITLE", "Voronoi diagram (generating - %3.2f%%)",{100*i/nsites})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
IupFlush()
<span style="color: #000080;font-style:italic;">-- t1 =look time()+0.25right</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=</span><span style="color: #000000;">siteX</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">width</span> <span style="color: #008080;">do</span>
end if
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">checkRow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
t1 = time()
<span style="color: #008080;">if</span> <span style="color: #000000;">timer_active</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for y=1 to height do
<span style="color: #008080;">if</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()></span><span style="color: #000000;">t1</span> <span style="color: #008080;">then</span>
integer nearest = nearestIndex[1,y]
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Voronoi diagram (generating - %3.2f%%)"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">100</span><span style="color: #0000FF;">*</span><span style="color: #000000;">i</span><span style="color: #0000FF;">/</span><span style="color: #000000;">nsites</span><span style="color: #0000FF;">})</span>
integer s = 1
<span style="color: #7060A8;">IupFlush</span><span style="color: #0000FF;">()</span>
for x=2 to width do
<span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()+</span><span style="color: #000000;">0.25</span>
if nearestIndex[x,y]<>nearest then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
cdCanvasSetForeground(cddbuffer, siteC[nearest])
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
cdCanvasLine(cddbuffer, s-1, y-1, x-2, y-1)
<span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
nearest = nearestIndex[x,y]
<span style="color: #008080;">for</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">height</span> <span style="color: #008080;">do</span>
s = x
<span style="color: #004080;">integer</span> <span style="color: #000000;">nearest</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">nearestIndex</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span>
end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">width</span> <span style="color: #008080;">do</span>
if timer_active then exit end if
<span style="color: #008080;">if</span> <span style="color: #000000;">nearestIndex</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]<></span><span style="color: #000000;">nearest</span> <span style="color: #008080;">then</span>
cdCanvasSetForeground(cddbuffer, siteC[nearest])
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">siteC</span><span style="color: #0000FF;">[</span><span style="color: #000000;">nearest</span><span style="color: #0000FF;">])</span>
cdCanvasLine(cddbuffer, s-1, y-1, width-1, y-1)
<span style="color: #7060A8;">cdCanvasLine</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #000000;">nearest</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">nearestIndex</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span>
if not timer_active then
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x</span>
cdCanvasSetForeground(cddbuffer, CD_BLACK)
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for i=1 to nsites do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
cdCanvasSector(cddbuffer, siteX[i], siteY[i], 2, 2, 0, 360)
<span style="color: #008080;">if</span> <span style="color: #000000;">timer_active</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">siteC</span><span style="color: #0000FF;">[</span><span style="color: #000000;">nearest</span><span style="color: #0000FF;">])</span>
cdCanvasFlush(cddbuffer)
<span style="color: #7060A8;">cdCanvasLine</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">width</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
IupSetStrAttribute(dlg, "TITLE", "Voronoi diagram - %s, %dx%d, %d sites, %3.2fs",{dmodes[dmode],width,height,nsites,time()-t0})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end if
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">timer_active</span> <span style="color: #008080;">then</span>
end if
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_BLACK</span><span style="color: #0000FF;">)</span>
return IUP_DEFAULT
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">nsites</span> <span style="color: #008080;">do</span>
end function
<span style="color: #7060A8;">cdCanvasSector</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">siteX</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">siteY</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">360</span><span style="color: #0000FF;">)</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
function map_cb(Ihandle ih)
<span style="color: #7060A8;">cdCanvasFlush</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
cdcanvas = cdCreateCanvas(CD_IUP, ih)
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Voronoi diagram - %s, %dx%d, %d sites, %3.2fs"</span><span style="color: #0000FF;">,</span>
cddbuffer = cdCreateCanvas(CD_DBUFFER, cdcanvas)
<span style="color: #0000FF;">{</span><span style="color: #000000;">dmodes</span><span style="color: #0000FF;">[</span><span style="color: #000000;">dmode</span><span style="color: #0000FF;">],</span><span style="color: #000000;">width</span><span style="color: #0000FF;">,</span><span style="color: #000000;">height</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nsites</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">})</span>
cdCanvasSetBackground(cddbuffer, CD_WHITE)
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
cdCanvasSetForeground(cddbuffer, CD_BLACK)
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return IUP_DEFAULT
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
function esc_close(Ihandle /*ih*/, atom c)
<span style="color: #008080;">function</span> <span style="color: #000000;">map_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
if c=K_ESC then return IUP_CLOSE end if
<span style="color: #000000;">cdcanvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_IUP</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
integer wasdmode = dmode
<span style="color: #000000;">cddbuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_DBUFFER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span><span style="color: #0000FF;">)</span>
switch c do
<span style="color: #7060A8;">cdCanvasSetBackground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_WHITE</span><span style="color: #0000FF;">)</span>
case '+': nsites *= 2
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_BLACK</span><span style="color: #0000FF;">)</span>
case '-': nsites = max(floor(nsites/2),1)
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
case 'E','e': dmode = EUCLID
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
case 'M','m': dmode = MANHATTAN
case 'W','w': dmode = MINKOWSKI
<span style="color: #008080;">function</span> <span style="color: #000000;">key_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
end switch
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_ESC</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CLOSE</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if dmode!=wasdmode
<span style="color: #004080;">integer</span> <span style="color: #000000;">wasdmode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dmode</span>
or nsites!=length(siteX) then
<span style="color: #008080;">switch</span> <span style="color: #000000;">c</span> <span style="color: #008080;">do</span>
-- give any current drawing process 0.1s to abandon:
<span style="color: #008080;">case</span> <span style="color: #008000;">'+'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">nsites</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">2</span>
timer_active = 1
<span style="color: #008080;">case</span> <span style="color: #008000;">'-'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">nsites</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nsites</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
IupStoreAttribute(timer, "RUN", "YES")
<span style="color: #008080;">case</span> <span style="color: #008000;">'E'</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'e'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dmode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">EUCLID</span>
-- IupUpdate(canvas)
<span style="color: #008080;">case</span> <span style="color: #008000;">'M'</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'m'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dmode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">MANHATTAN</span>
end if
<span style="color: #008080;">case</span> <span style="color: #008000;">'W'</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'w'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">dmode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">MINKOWSKI</span>
return IUP_CONTINUE
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
end function
<span style="color: #008080;">if</span> <span style="color: #000000;">dmode</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">wasdmode</span>
 
<span style="color: #008080;">or</span> <span style="color: #000000;">nsites</span><span style="color: #0000FF;">!=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">siteX</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
function timer_cb(Ihandle /*ih*/)
<span style="color: #000080;font-style:italic;">-- give any current drawing process 0.1s to abandon:</span>
timer_active = 0
<span style="color: #000000;">timer_active</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
IupStoreAttribute(timer, "RUN", "NO")
<span style="color: #7060A8;">IupStoreAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RUN"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"YES"</span><span style="color: #0000FF;">)</span>
IupUpdate(canvas)
<span style="color: #000080;font-style:italic;">-- IupUpdate(canvas)</span>
return IUP_IGNORE
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CONTINUE</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
procedure main()
IupOpen()
<span style="color: #008080;">function</span> <span style="color: #000000;">timer_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">timer_active</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
canvas = IupCanvas(NULL)
<span style="color: #7060A8;">IupStoreAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RUN"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"NO"</span><span style="color: #0000FF;">)</span>
IupSetAttribute(canvas, "RASTERSIZE", "600x400") -- initial size
<span style="color: #7060A8;">IupUpdate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">)</span>
IupSetCallback(canvas, "MAP_CB", Icallback("map_cb"))
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_IGNORE</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
timer = IupTimer(Icallback("timer_cb"), 100, 0) -- (inactive)
 
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
dlg = IupDialog(canvas)
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
IupSetAttribute(dlg, "TITLE", "Voronoi diagram")
IupSetCallback(dlg, "K_ANY", Icallback("esc_close"))
<span style="color: #000000;">canvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupCanvas</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"RASTERSIZE=600x400"</span><span style="color: #0000FF;">)</span>
IupSetCallback(canvas, "ACTION", Icallback("redraw_cb"))
<span style="color: #7060A8;">IupSetCallbacks</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"MAP_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"map_cb"</span><span style="color: #0000FF;">),</span>
 
<span style="color: #008000;">"ACTION"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"redraw_cb"</span><span style="color: #0000FF;">)})</span>
IupMap(dlg)
IupSetAttribute(canvas, "RASTERSIZE", NULL) -- release the minimum limitation
<span style="color: #000000;">timer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupTimer</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"timer_cb"</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (inactive)</span>
IupShowXY(dlg,IUP_CENTER,IUP_CENTER)
IupMainLoop()
<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`TITLE="Voronoi diagram"`</span><span style="color: #0000FF;">)</span>
IupClose()
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"KEY_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"key_cb"</span><span style="color: #0000FF;">))</span>
end procedure
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
main()</lang>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RASTERSIZE"</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">NULL</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- release the minimum limitation</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
 
=={{header|Processing}}==
{{trans|Python}}
<langsyntaxhighlight Javalang="java">void setup() {
size(500, 500);
generateVoronoiDiagram(width, height, 25);
Line 1,747 ⟶ 1,878:
}
}
</syntaxhighlight>
</lang>
 
==={{header|Processing Python mode}}===
{{trans|Python}}
<langsyntaxhighlight Pythonlang="python">def setup():
size(500, 500)
generate_voronoi_diagram(width, height, 25)
Line 1,774 ⟶ 1,905:
j = i
set(x, y, color(nr[j], ng[j], nb[j]))
</syntaxhighlight>
</lang>
 
=={{header|Prolog}}==
Line 1,781 ⟶ 1,912:
 
 
<langsyntaxhighlight Prologlang="prolog">:- dynamic pt/6.
voronoi :-
V is random(20) + 20,
Line 1,842 ⟶ 1,973:
minkowski_3(X1, Y1, X2, Y2, D) :-
D is (abs(X2 - X1)**3 + abs(Y2-Y1)**3)**0.33.
</syntaxhighlight>
</lang>
[[File:prolog_manhattan.png|320px]]
[[File:prolog_euclide.png‎|320px]]
Line 1,851 ⟶ 1,982:
===Euclidean===
[[File:Voronoi_PureBasic.png‎|320px|thumb|center|Voronoi Diagram in PureBasic]]
<langsyntaxhighlight PureBasiclang="purebasic">Structure VCoo
x.i: y.i
Colour.i: FillColour.i
Line 1,920 ⟶ 2,051:
If file$ <> ""
SaveImage(img, file$, #PB_ImagePlugin_PNG)
EndIf</langsyntaxhighlight>
 
===Taxicab===
[[File:Voronoi_Diagram_in_PureBasic_(Taxicab).png‎|320px|thumb|center|Voronoi Diagram in PureBasic]]
<langsyntaxhighlight PureBasiclang="purebasic">Structure VCoo
x.i: y.i
Colour.i: FillColour.i
Line 1,991 ⟶ 2,122:
If file$ <> ""
SaveImage(img, file$, #PB_ImagePlugin_PNG)
EndIf</langsyntaxhighlight>
 
=={{header|Python}}==
 
This implementation takes in a list of points, each point being a tuple and returns a dictionary consisting of all the points at a given site.
<langsyntaxhighlight lang="python">from PIL import Image
import random
import math
Line 2,027 ⟶ 2,158:
image.show()
generate_voronoi_diagram(500, 500, 25)</langsyntaxhighlight>
{{out}}
[[File:Voronoi_python.png|500px|thumb|center|Voronoi Diagram in Python]]
 
Alternatively, vectorized code leveraging numpy and scipy is 2x shorter and 10x faster, as seen below.
 
Note that for large numbers of points, using a KDTree will be much faster thanks to lookups in log(N) time rather than N comparisons at every coordinate. The code below has running time O(X*Y*log(N)), whereas the code above has running time O(X*Y*N). For 1000 points, the code below is 250x faster than the above.
 
Alternative metrics can be supported by using a [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree.query scikit-learn KDTree ].
 
<syntaxhighlight lang="python">
import numpy as np
from PIL import Image
from scipy.spatial import KDTree
 
def generate_voronoi_diagram(X, Y, num_cells):
# Random colors and points
colors = np.random.randint((256, 256, 256), size=(num_cells, 3), dtype=np.uint8)
points = np.random.randint((Y, X), size=(num_cells, 2))
 
# Construct a list of all possible (y,x) coordinates
idx = np.indices((Y, X))
coords = np.moveaxis(idx, 0, -1).reshape((-1, 2))
 
# Find the closest point to each coordinate
_d, labels = KDTree(points).query(coords)
labels = labels.reshape((Y, X))
 
# Export an RGB image
rgb = colors[labels]
img = Image.fromarray(rgb, mode='RGB')
img.save('VoronoiDiagram.png', 'PNG')
img.show()
return rgb
</syntaxhighlight>
 
=={{header|QB64}}==
{{trans|Liberty Basic}}
<syntaxhighlight lang="qb64">_Title "Voronoi Diagram"
 
Dim As Integer pnt, px, py, i, x, y, adjct, sy, ly
Dim As Double st
 
'=====================================================================
' Changes number of points and screen size here
'=====================================================================
pnt = 100
px = 512
py = 512
'=====================================================================
Screen _NewImage(px, py, 32)
Randomize Timer
 
Dim Shared As Integer pax(pnt), pay(pnt), indx(px, py)
Dim Shared As Long dSqr(px, py)
Dim As Long col(pnt)
 
For i = 1 To pnt
pax(i) = Int(Rnd * px)
pay(i) = Int(Rnd * py)
col(i) = _RGB(Rnd * 256, Rnd * 256, Rnd * 256)
Next
st = Timer
For x = 0 To px - 1
For y = 0 To py - 1
dSqr(x, y) = (pax(1) - x) * (pax(1) - x) + (pay(1) - y) * (pay(1) - y)
indx(x, y) = 1
Next
Next
 
For i = 2 To pnt
ly = py - 1
For x = pax(i) To 0 Step -1
If (scan(i, x, ly)) = 0 Then Exit For
Next x
For x = pax(i) + 1 To px - 1
If (scan(i, x, ly)) = 0 Then Exit For
Next
Next
 
For x = 0 To px - 1
For y = 0 To py - 1
sy = y
adjct = indx(x, y)
For y = y + 1 To py
If indx(x, y) <> adjct Then y = y - 1: Exit For
Next
Line (x, sy)-(x, y + 1), col(adjct)
Next
Next
 
Sleep
System
 
Function scan (site As Integer, x As Integer, ly As Integer)
Dim As Integer ty
Dim As Long delt2, dsq
delt2 = (pax(site) - x) * (pax(site) - x)
For ty = 0 To ly
dsq = (pay(site) - ty) * (pay(site) - ty) + delt2
If dsq <= dSqr(x, ty) Then
dSqr(x, ty) = dsq
indx(x, ty) = site
scan = 1
End If
Next
End Function</syntaxhighlight>
 
=={{header|R}}==
Line 2,046 ⟶ 2,281:
[[File:VDR310.png|200px|right|thumb|Output VDR310.png]]
 
<syntaxhighlight lang="r">
<lang r>
## HF#1 Random Hex color
randHclr <- function() {
Line 2,098 ⟶ 2,333:
pVoronoiD(10,"","",2) ## Manhattan metric
pVoronoiD(10,"","",3) ## Minkovski metric
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Line 2,121 ⟶ 2,356:
First approach
 
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 2,149 ⟶ 2,384:
(define c (argmin (curryr (metric) x) centroids))
(dict-set res c (cons x (dict-ref res c)))))
</syntaxhighlight>
</lang>
 
Different metrics
<langsyntaxhighlight lang="racket">
(define (euclidean-distance a b)
(for/sum ([x (in-vector a)] [y (in-vector b)])
Line 2,162 ⟶ 2,397:
 
(define metric (make-parameter euclidean-distance))
</syntaxhighlight>
</lang>
 
[[File:voronoi2.png|200px|thumb|right|The contour plot of the classification function.]]
Line 2,170 ⟶ 2,405:
Alternative approach
 
<langsyntaxhighlight lang="racket">
;; Plots the Voronoi diagram as a contour plot of
;; the classification function built for a set of points
Line 2,195 ⟶ 2,430:
(λ (x)
(hash-ref tbl (argmin (curry (metric) x) centroids))))
</syntaxhighlight>
</lang>
 
 
{{out}}
<langsyntaxhighlight lang="racket">
(define pts
(for/list ([i 50]) (vector (random) (random))))
Line 2,220 ⟶ 2,455:
#:alphas '(1))
(points3d pts3d #:sym 'fullcircle3)))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 2,230 ⟶ 2,465:
Generates a Euclidean, a Taxicab and a Minkowski Voronoi diagram using the same set of domain points and colors.
 
<syntaxhighlight lang="raku" perl6line>use Image::PNG::Portable;
 
my @bars = '▁▂▃▅▆▇▇▆▅▃▂▁'.comb;
Line 2,274 ⟶ 2,509:
}
}
</syntaxhighlight>
</lang>
 
See [https://github.com/thundergnat/rc/blob/master/img/Voronoi-Euclidean-perl6.png Euclidean], [https://github.com/thundergnat/rc/blob/master/img/Voronoi-Taxicab-perl6.png Taxicab] & [https://github.com/thundergnat/rc/blob/master/img/Voronoi-Minkowski-perl6.png Minkowski] Voronoi diagram example images.
 
=={{header|Red}}==
<langsyntaxhighlight lang="red">Red [
Source: https://github.com/vazub/rosetta-red
Tabs: 4
Line 2,341 ⟶ 2,576:
image diagram-l1 image diagram-l2
]
</syntaxhighlight>
</lang>
 
=={{header|ReScript}}==
<syntaxhighlight lang="rescript">let n_sites = 60
 
let size_x = 640
let size_y = 480
 
let rand_int_range = (a, b) => a + Random.int(b - a + 1)
 
let dist_euclidean = (x, y) => { (x * x + y * y) }
let dist_minkowski = (x, y) => { (x * x * x + y * y * y) }
let dist_taxicab = (x, y) => { abs(x) + abs(y) }
 
let dist_f = dist_euclidean
let dist_f = dist_minkowski
let dist_f = dist_taxicab
 
let nearest_site = (site, x, y) => {
let ret = ref(0)
let dist = ref(0)
Js.Array2.forEachi(site, ((sx, sy), k) => {
let d = dist_f((x - sx), (y - sy))
if (k == 0 || d < dist.contents) {
dist.contents = d
ret.contents = k
}
})
ret.contents
}
 
let gen_map = (site, rgb) => {
let nearest = Belt.Array.make((size_x * size_y), 0)
let buf = Belt.Array.make((3 * size_x * size_y), 0)
for y in 0 to size_y - 1 {
for x in 0 to size_x - 1 {
nearest[y * size_x + x] = nearest_site(site, x, y)
}
}
for i in 0 to (size_y * size_x) - 1 {
let j = i * 3
let (r, g, b) = rgb[nearest[i]]
buf[j+0] = r
buf[j+1] = g
buf[j+2] = b
}
Printf.printf("P3\n%d %d\n255\n", size_x, size_y)
Js.Array2.forEach(buf, (d) => Printf.printf("%d\n", d))
}
 
{
Random.self_init ();
let site =
Belt.Array.makeBy(n_sites, (i) => {
(Random.int(size_x),
Random.int(size_y))
})
 
let rgb =
Belt.Array.makeBy(n_sites, (i) => {
(rand_int_range( 50, 120),
rand_int_range( 80, 180),
rand_int_range(140, 240))
})
gen_map(site, rgb)
}
</syntaxhighlight>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Voronoi diagram
 
Line 2,466 ⟶ 2,770:
next
return number(str)
</syntaxhighlight>
</lang>
Output image:
 
Line 2,474 ⟶ 2,778:
Uses [[Raster graphics operations/Ruby]]
[[File:voronoi_rb.png|thumb|right|Sample output from Ruby program]]
<langsyntaxhighlight lang="ruby"># frozen_string_literal: true
 
require_relative 'raster_graphics'
Line 2,512 ⟶ 2,816:
end
 
pixmap.save_as_png('voronoi_rb.png')</langsyntaxhighlight>
 
{{libheader|RubyGems}}
{{libheader|JRubyArt}}
JRubyArt is a port of processing to ruby
<syntaxhighlight lang="ruby"># frozen_string_literal: true
<lang ruby>
# frozen_string_literal: true
 
Tile = Struct.new(:x, :y, :color) do
attr_reader :colors, :positions
def sq_dist(a, b)
(x - a)**2 + (y - b)**2
end
end
 
attr_reader :tiles
 
def settings
Line 2,529 ⟶ 2,838:
sketch_title 'Voronoi Diagram'
load_pixels
color_mode(HSB, 360, 1, 1.0)
@colorstiles = generate_colorsgenerate_tiles(30)
@positions = generate_positions(30)
draw_voronoi
update_pixels
Line 2,537 ⟶ 2,845:
end
 
def generate_colorsgenerate_tiles(num)
(0..num).map { colorTile.new(rand(360width), rand(height), color(rand, 1.0, 1.0)) }
end
 
def generate_positions(num)
(0..num).map { Vec2D.new(rand(width), rand(height)) }
end
 
def draw_voronoi
grid(width, height) do |x, y|
posclosest = Vec2Dtiles.newmin_by { |tile| tile.sq_dist(x, y) }
pixels[x + y * width] = closest.color
closest = positions.min_by { |posn| posn.dist(pos) }
index = positions.index closest
pixels[x + y * width] = colors[index]
end
end
 
def draw_voronoi_centers
positionstiles.each do |poscenter|
no_stroke
fill 0
ellipse(poscenter.x, poscenter.y, 4, 4)
end
end
 
 
</lang>
</syntaxhighlight>
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">graphic #g, 400,400
#g flush()
spots = 100
Line 2,639 ⟶ 2,942:
end if
next y
end function</langsyntaxhighlight>
 
=={{header|Rust}}==
Line 2,647 ⟶ 2,950:
The entire code, including the Crate.toml and a precompiled binary for Windows x86_64, can be found at https://github.com/ctrlcctrlv/interactive-voronoi/
 
<langsyntaxhighlight Rustlang="rust">extern crate piston;
extern crate opengl_graphics;
extern crate graphics;
Line 2,827 ⟶ 3,130:
);
}
</syntaxhighlight>
</lang>
 
=={{header|Scala}}==
Line 2,833 ⟶ 3,136:
{{libheader|Scala Java Swing interoperability}}
{{works with|Scala|2.13}}
<langsyntaxhighlight Scalalang="scala">import java.awt.geom.Ellipse2D
import java.awt.image.BufferedImage
import java.awt.{Color, Graphics, Graphics2D}
Line 2,874 ⟶ 3,177:
}
 
}</langsyntaxhighlight>
 
=={{header|Seed7}}==
[[file:Seed7Voronoi.png|thumb|right]]
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "draw.s7i";
include "keybd.s7i";
Line 2,929 ⟶ 3,232:
KEYBOARD := GRAPH_KEYBOARD;
readln(KEYBOARD);
end func;</langsyntaxhighlight>
 
Original source: [http://seed7.sourceforge.net/algorith/graphic.htm#voronoi]
Line 2,935 ⟶ 3,238:
=={{header|Sidef}}==
{{trans|Python}}
<langsyntaxhighlight lang="ruby">require('Imager')
 
func generate_voronoi_diagram(width, height, num_cells) {
Line 2,957 ⟶ 3,260:
 
var img = generate_voronoi_diagram(500, 500, 25)
img.write(file => 'VoronoiDiagram.png')</langsyntaxhighlight>
Output image: [https://github.com/trizen/rc/blob/master/img/voronoi-diagram-sidef.png Voronoi diagram]
 
=={{header|Tcl}}==
{{libheader|Tk}}
<langsyntaxhighlight lang="tcl">package require Tk
proc r to {expr {int(rand()*$to)}}; # Simple helper
 
Line 2,996 ⟶ 3,299:
# To display while generating, uncomment this line and the other one so commented
#update
voronoi demo 60</langsyntaxhighlight>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|DOME}}
<langsyntaxhighlight ecmascriptlang="wren">import "graphics" for Canvas, Color
import "dome" for Window
import "random" for Random
Line 3,044 ⟶ 3,347:
}
}
}</langsyntaxhighlight>
 
=={{header|XPL0}}==
[[File:VoronoiXPL0.gif|right]]
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes; \intrinsic 'code' declarations
 
def N = 15; \number of sites
Line 3,069 ⟶ 3,372:
I:= ChIn(1); \wait for keystroke
SetVid($03); \restore normal text screen
]</langsyntaxhighlight>
 
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">
<lang Yabasic>
clear screen
 
Line 3,149 ⟶ 3,452:
next y
return check
end sub</langsyntaxhighlight>
 
{{trans|Python}}
<langsyntaxhighlight Yabasiclang="yabasic">width = 500 : height = 500
open window width, height
 
Line 3,184 ⟶ 3,487:
end sub
generate_voronoi_diagram(width, height, 25)</langsyntaxhighlight>
 
=={{header|zkl}}==
Line 3,190 ⟶ 3,493:
{{trans|Python}}
[[File:VoronoiDiagram.zkl.jpg|250px|thumb|right]]
<langsyntaxhighlight lang="zkl">fcn generate_voronoi_diagram(width,height,num_cells){
image,imgx,imgy:=PPM(width,height),width,height;
nx:=num_cells.pump(List,(0).random.fp(imgx));
Line 3,208 ⟶ 3,511:
}
image
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">generate_voronoi_diagram(500,500,25).write(File("VoronoiDiagram.ppm","wb"));</langsyntaxhighlight>
 
{{omit from|GUISS}}
1,978

edits