1*7894b854Sdrh#!/usr/bin/tclsh 2*7894b854Sdrh# 3*7894b854Sdrh# This script generates a cluster of random polygons that are useful 4*7894b854Sdrh# for testing the geopoly extension. 5*7894b854Sdrh# 6*7894b854Sdrh# Usage: 7*7894b854Sdrh# 8*7894b854Sdrh# tclsh randomshape.tcl | tee x.sql | sqlite3 >x.html 9*7894b854Sdrh# 10*7894b854Sdrh# The output files are x.sql and x.html. Run the above multiple times 11*7894b854Sdrh# until an interesting "x.html" file is found, then use the "x.sql" inputs 12*7894b854Sdrh# to construct test cases. 13*7894b854Sdrh# 14*7894b854Sdrhproc randomenclosure {cx cy p1 p2 p3 p4} { 15*7894b854Sdrh set r 0 16*7894b854Sdrh set pi 3.145926 17*7894b854Sdrh set pi2 [expr {$pi*2}] 18*7894b854Sdrh set x0 [expr {$cx + rand()*$p3 + $p4}] 19*7894b854Sdrh set ans "\[\[$x0,$cy\]" 20*7894b854Sdrh while {1} { 21*7894b854Sdrh set r [expr {$r+$p1+$p2*rand()}] 22*7894b854Sdrh if {$r>=$pi2} break 23*7894b854Sdrh set m [expr {rand()*$p3 + $p4}] 24*7894b854Sdrh set x [expr {$cx+$m*cos($r)}] 25*7894b854Sdrh set y [expr {$cy+$m*sin($r)}] 26*7894b854Sdrh append ans ",\[$x,$y\]" 27*7894b854Sdrh } 28*7894b854Sdrh append ans ",\[$x0,$cy\]\]" 29*7894b854Sdrh return $ans 30*7894b854Sdrh} 31*7894b854Sdrhproc randomshape1 {} { 32*7894b854Sdrh set cx [expr {100+int(rand()*800)}] 33*7894b854Sdrh set cy [expr {100+int(rand()*600)}] 34*7894b854Sdrh set p1 [expr {rand()*0.1}] 35*7894b854Sdrh set p2 [expr {rand()*0.5+0.5}] 36*7894b854Sdrh set p3 [expr {rand()*100+25}] 37*7894b854Sdrh set p4 [expr {rand()*25}] 38*7894b854Sdrh return [randomenclosure $cx $cy $p1 $p2 $p3 $p4] 39*7894b854Sdrh} 40*7894b854Sdrhproc randomshape1_sm {} { 41*7894b854Sdrh set cx [expr {100+int(rand()*800)}] 42*7894b854Sdrh set cy [expr {100+int(rand()*600)}] 43*7894b854Sdrh set p1 [expr {rand()*0.1}] 44*7894b854Sdrh set p2 [expr {rand()*0.5+0.5}] 45*7894b854Sdrh set p3 [expr {rand()*10+25}] 46*7894b854Sdrh set p4 [expr {rand()*5}] 47*7894b854Sdrh return [randomenclosure $cx $cy $p1 $p2 $p3 $p4] 48*7894b854Sdrh} 49*7894b854Sdrhproc randomshape2 {} { 50*7894b854Sdrh set cx [expr {400+int(rand()*200)}] 51*7894b854Sdrh set cy [expr {300+int(rand()*200)}] 52*7894b854Sdrh set p1 [expr {rand()*0.05}] 53*7894b854Sdrh set p2 [expr {rand()*0.5+0.5}] 54*7894b854Sdrh set p3 [expr {rand()*50+200}] 55*7894b854Sdrh set p4 [expr {rand()*50+100}] 56*7894b854Sdrh return [randomenclosure $cx $cy $p1 $p2 $p3 $p4] 57*7894b854Sdrh} 58*7894b854Sdrhproc randomcolor {} { 59*7894b854Sdrh set n [expr {int(rand()*5)}] 60*7894b854Sdrh return [lindex {red orange green blue purple} $n] 61*7894b854Sdrh} 62*7894b854Sdrh 63*7894b854Sdrhputs {.print '<html>'} 64*7894b854Sdrhputs {.print '<svg width="1000" height="800" style="border:1px solid black">'} 65*7894b854Sdrhputs {CREATE TABLE t1(poly,clr);} 66*7894b854Sdrhputs {CREATE TABLE t2(poly,clr);} 67*7894b854Sdrhfor {set i 0} {$i<30} {incr i} { 68*7894b854Sdrh puts "INSERT INTO t1(rowid,poly,clr)" 69*7894b854Sdrh puts " VALUES($i,'[randomshape1]','[randomcolor]');" 70*7894b854Sdrh} 71*7894b854Sdrhfor {set i 30} {$i<80} {incr i} { 72*7894b854Sdrh puts "INSERT INTO t1(rowid,poly,clr)" 73*7894b854Sdrh puts " VALUES($i,'[randomshape1_sm]','[randomcolor]');" 74*7894b854Sdrh} 75*7894b854Sdrhfor {set i 100} {$i<105} {incr i} { 76*7894b854Sdrh puts "INSERT INTO t2(rowid,poly,clr)" 77*7894b854Sdrh puts " VALUES($i,'[randomshape2]','[randomcolor]');" 78*7894b854Sdrh} 79*7894b854Sdrh 80*7894b854Sdrhputs {DELETE FROM t1 WHERE geopoly_json(poly) IS NULL;} 81*7894b854Sdrhputs {SELECT geopoly_svg(poly, 82*7894b854Sdrh printf('style="fill:none;stroke:%s;stroke-width:1;"',clr)) 83*7894b854Sdrh FROM t1;} 84*7894b854Sdrhputs {SELECT geopoly_svg(poly, 85*7894b854Sdrh printf('style="fill:none;stroke:%s;stroke-width:2;"',clr)) 86*7894b854Sdrh FROM t2;} 87*7894b854Sdrhputs {.print '<svg>'} 88