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