/ Hex Artifact Content
Login

Artifact 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 54 68 69 73 20 73 63 72 69 70 74  .#.# This script
0020: 20 67 65 6e 65 72 61 74 65 73 20 61 20 63 6c 75   generates a clu
0030: 73 74 65 72 20 6f 66 20 72 61 6e 64 6f 6d 20 70  ster of random p
0040: 6f 6c 79 67 6f 6e 73 20 74 68 61 74 20 61 72 65  olygons that are
0050: 20 75 73 65 66 75 6c 0a 23 20 66 6f 72 20 74 65   useful.# for te
0060: 73 74 69 6e 67 20 74 68 65 20 67 65 6f 70 6f 6c  sting the geopol
0070: 79 20 65 78 74 65 6e 73 69 6f 6e 2e 0a 23 0a 23  y extension..#.#
0080: 20 55 73 61 67 65 3a 0a 23 0a 23 20 20 20 20 74   Usage:.#.#    t
0090: 63 6c 73 68 20 72 61 6e 64 6f 6d 73 68 61 70 65  clsh randomshape
00a0: 2e 74 63 6c 20 7c 20 74 65 65 20 78 2e 73 71 6c  .tcl | tee x.sql
00b0: 20 7c 20 73 71 6c 69 74 65 33 20 3e 78 2e 68 74   | sqlite3 >x.ht
00c0: 6d 6c 0a 23 0a 23 20 54 68 65 20 6f 75 74 70 75  ml.#.# The outpu
00d0: 74 20 66 69 6c 65 73 20 61 72 65 20 78 2e 73 71  t files are x.sq
00e0: 6c 20 61 6e 64 20 78 2e 68 74 6d 6c 2e 20 20 52  l and x.html.  R
00f0: 75 6e 20 74 68 65 20 61 62 6f 76 65 20 6d 75 6c  un the above mul
0100: 74 69 70 6c 65 20 74 69 6d 65 73 0a 23 20 75 6e  tiple times.# un
0110: 74 69 6c 20 61 6e 20 69 6e 74 65 72 65 73 74 69  til an interesti
0120: 6e 67 20 22 78 2e 68 74 6d 6c 22 20 66 69 6c 65  ng "x.html" file
0130: 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
0140: 75 73 65 20 74 68 65 20 22 78 2e 73 71 6c 22 20  use the "x.sql" 
0150: 69 6e 70 75 74 73 0a 23 20 74 6f 20 63 6f 6e 73  inputs.# to cons
0160: 74 72 75 63 74 20 74 65 73 74 20 63 61 73 65 73  truct test cases
0170: 2e 0a 23 0a 70 72 6f 63 20 72 61 6e 64 6f 6d 65  ..#.proc randome
0180: 6e 63 6c 6f 73 75 72 65 20 7b 63 78 20 63 79 20  nclosure {cx cy 
0190: 70 31 20 70 32 20 70 33 20 70 34 7d 20 7b 0a 20  p1 p2 p3 p4} {. 
01a0: 20 73 65 74 20 72 20 30 0a 20 20 73 65 74 20 70   set r 0.  set p
01b0: 69 20 33 2e 31 34 35 39 32 36 0a 20 20 73 65 74  i 3.145926.  set
01c0: 20 70 69 32 20 5b 65 78 70 72 20 7b 24 70 69 2a   pi2 [expr {$pi*
01d0: 32 7d 5d 0a 20 20 73 65 74 20 78 30 20 5b 65 78  2}].  set x0 [ex
01e0: 70 72 20 7b 24 63 78 20 2b 20 72 61 6e 64 28 29  pr {$cx + rand()
01f0: 2a 24 70 33 20 2b 20 24 70 34 7d 5d 0a 20 20 73  *$p3 + $p4}].  s
0200: 65 74 20 61 6e 73 20 22 5c 5b 5c 5b 24 78 30 2c  et ans "\[\[$x0,
0210: 24 63 79 5c 5d 22 0a 20 20 77 68 69 6c 65 20 7b  $cy\]".  while {
0220: 31 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 20 5b  1} {.    set r [
0230: 65 78 70 72 20 7b 24 72 2b 24 70 31 2b 24 70 32  expr {$r+$p1+$p2
0240: 2a 72 61 6e 64 28 29 7d 5d 0a 20 20 20 20 69 66  *rand()}].    if
0250: 20 7b 24 72 3e 3d 24 70 69 32 7d 20 62 72 65 61   {$r>=$pi2} brea
0260: 6b 0a 20 20 20 20 73 65 74 20 6d 20 5b 65 78 70  k.    set m [exp
0270: 72 20 7b 72 61 6e 64 28 29 2a 24 70 33 20 2b 20  r {rand()*$p3 + 
0280: 24 70 34 7d 5d 0a 20 20 20 20 73 65 74 20 78 20  $p4}].    set x 
0290: 5b 65 78 70 72 20 7b 24 63 78 2b 24 6d 2a 63 6f  [expr {$cx+$m*co
02a0: 73 28 24 72 29 7d 5d 0a 20 20 20 20 73 65 74 20  s($r)}].    set 
02b0: 79 20 5b 65 78 70 72 20 7b 24 63 79 2b 24 6d 2a  y [expr {$cy+$m*
02c0: 73 69 6e 28 24 72 29 7d 5d 0a 20 20 20 20 61 70  sin($r)}].    ap
02d0: 70 65 6e 64 20 61 6e 73 20 22 2c 5c 5b 24 78 2c  pend ans ",\[$x,
02e0: 24 79 5c 5d 22 0a 20 20 7d 0a 20 20 61 70 70 65  $y\]".  }.  appe
02f0: 6e 64 20 61 6e 73 20 22 2c 5c 5b 24 78 30 2c 24  nd ans ",\[$x0,$
0300: 63 79 5c 5d 5c 5d 22 0a 20 20 72 65 74 75 72 6e  cy\]\]".  return
0310: 20 24 61 6e 73 0a 7d 0a 70 72 6f 63 20 72 61 6e   $ans.}.proc ran
0320: 64 6f 6d 73 68 61 70 65 31 20 7b 7d 20 7b 0a 20  domshape1 {} {. 
0330: 20 73 65 74 20 63 78 20 5b 65 78 70 72 20 7b 31   set cx [expr {1
0340: 30 30 2b 69 6e 74 28 72 61 6e 64 28 29 2a 38 30  00+int(rand()*80
0350: 30 29 7d 5d 0a 20 20 73 65 74 20 63 79 20 5b 65  0)}].  set cy [e
0360: 78 70 72 20 7b 31 30 30 2b 69 6e 74 28 72 61 6e  xpr {100+int(ran
0370: 64 28 29 2a 36 30 30 29 7d 5d 0a 20 20 73 65 74  d()*600)}].  set
0380: 20 70 31 20 5b 65 78 70 72 20 7b 72 61 6e 64 28   p1 [expr {rand(
0390: 29 2a 30 2e 31 7d 5d 0a 20 20 73 65 74 20 70 32  )*0.1}].  set p2
03a0: 20 5b 65 78 70 72 20 7b 72 61 6e 64 28 29 2a 30   [expr {rand()*0
03b0: 2e 35 2b 30 2e 35 7d 5d 0a 20 20 73 65 74 20 70  .5+0.5}].  set p
03c0: 33 20 5b 65 78 70 72 20 7b 72 61 6e 64 28 29 2a  3 [expr {rand()*
03d0: 31 30 30 2b 32 35 7d 5d 0a 20 20 73 65 74 20 70  100+25}].  set p
03e0: 34 20 5b 65 78 70 72 20 7b 72 61 6e 64 28 29 2a  4 [expr {rand()*
03f0: 32 35 7d 5d 0a 20 20 72 65 74 75 72 6e 20 5b 72  25}].  return [r
0400: 61 6e 64 6f 6d 65 6e 63 6c 6f 73 75 72 65 20 24  andomenclosure $
0410: 63 78 20 24 63 79 20 24 70 31 20 24 70 32 20 24  cx $cy $p1 $p2 $
0420: 70 33 20 24 70 34 5d 0a 7d 0a 70 72 6f 63 20 72  p3 $p4].}.proc r
0430: 61 6e 64 6f 6d 73 68 61 70 65 31 5f 73 6d 20 7b  andomshape1_sm {
0440: 7d 20 7b 0a 20 20 73 65 74 20 63 78 20 5b 65 78  } {.  set cx [ex
0450: 70 72 20 7b 31 30 30 2b 69 6e 74 28 72 61 6e 64  pr {100+int(rand
0460: 28 29 2a 38 30 30 29 7d 5d 0a 20 20 73 65 74 20  ()*800)}].  set 
0470: 63 79 20 5b 65 78 70 72 20 7b 31 30 30 2b 69 6e  cy [expr {100+in
0480: 74 28 72 61 6e 64 28 29 2a 36 30 30 29 7d 5d 0a  t(rand()*600)}].
0490: 20 20 73 65 74 20 70 31 20 5b 65 78 70 72 20 7b    set p1 [expr {
04a0: 72 61 6e 64 28 29 2a 30 2e 31 7d 5d 0a 20 20 73  rand()*0.1}].  s
04b0: 65 74 20 70 32 20 5b 65 78 70 72 20 7b 72 61 6e  et p2 [expr {ran
04c0: 64 28 29 2a 30 2e 35 2b 30 2e 35 7d 5d 0a 20 20  d()*0.5+0.5}].  
04d0: 73 65 74 20 70 33 20 5b 65 78 70 72 20 7b 72 61  set p3 [expr {ra
04e0: 6e 64 28 29 2a 31 30 2b 32 35 7d 5d 0a 20 20 73  nd()*10+25}].  s
04f0: 65 74 20 70 34 20 5b 65 78 70 72 20 7b 72 61 6e  et p4 [expr {ran
0500: 64 28 29 2a 35 7d 5d 0a 20 20 72 65 74 75 72 6e  d()*5}].  return
0510: 20 5b 72 61 6e 64 6f 6d 65 6e 63 6c 6f 73 75 72   [randomenclosur
0520: 65 20 24 63 78 20 24 63 79 20 24 70 31 20 24 70  e $cx $cy $p1 $p
0530: 32 20 24 70 33 20 24 70 34 5d 0a 7d 0a 70 72 6f  2 $p3 $p4].}.pro
0540: 63 20 72 61 6e 64 6f 6d 73 68 61 70 65 32 20 7b  c randomshape2 {
0550: 7d 20 7b 0a 20 20 73 65 74 20 63 78 20 5b 65 78  } {.  set cx [ex
0560: 70 72 20 7b 34 30 30 2b 69 6e 74 28 72 61 6e 64  pr {400+int(rand
0570: 28 29 2a 32 30 30 29 7d 5d 0a 20 20 73 65 74 20  ()*200)}].  set 
0580: 63 79 20 5b 65 78 70 72 20 7b 33 30 30 2b 69 6e  cy [expr {300+in
0590: 74 28 72 61 6e 64 28 29 2a 32 30 30 29 7d 5d 0a  t(rand()*200)}].
05a0: 20 20 73 65 74 20 70 31 20 5b 65 78 70 72 20 7b    set p1 [expr {
05b0: 72 61 6e 64 28 29 2a 30 2e 30 35 7d 5d 0a 20 20  rand()*0.05}].  
05c0: 73 65 74 20 70 32 20 5b 65 78 70 72 20 7b 72 61  set p2 [expr {ra
05d0: 6e 64 28 29 2a 30 2e 35 2b 30 2e 35 7d 5d 0a 20  nd()*0.5+0.5}]. 
05e0: 20 73 65 74 20 70 33 20 5b 65 78 70 72 20 7b 72   set p3 [expr {r
05f0: 61 6e 64 28 29 2a 35 30 2b 32 30 30 7d 5d 0a 20  and()*50+200}]. 
0600: 20 73 65 74 20 70 34 20 5b 65 78 70 72 20 7b 72   set p4 [expr {r
0610: 61 6e 64 28 29 2a 35 30 2b 31 30 30 7d 5d 0a 20  and()*50+100}]. 
0620: 20 72 65 74 75 72 6e 20 5b 72 61 6e 64 6f 6d 65   return [randome
0630: 6e 63 6c 6f 73 75 72 65 20 24 63 78 20 24 63 79  nclosure $cx $cy
0640: 20 24 70 31 20 24 70 32 20 24 70 33 20 24 70 34   $p1 $p2 $p3 $p4
0650: 5d 0a 7d 0a 70 72 6f 63 20 72 61 6e 64 6f 6d 63  ].}.proc randomc
0660: 6f 6c 6f 72 20 7b 7d 20 7b 0a 20 20 73 65 74 20  olor {} {.  set 
0670: 6e 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e  n [expr {int(ran
0680: 64 28 29 2a 35 29 7d 5d 0a 20 20 72 65 74 75 72  d()*5)}].  retur
0690: 6e 20 5b 6c 69 6e 64 65 78 20 7b 72 65 64 20 6f  n [lindex {red o
06a0: 72 61 6e 67 65 20 67 72 65 65 6e 20 62 6c 75 65  range green blue
06b0: 20 70 75 72 70 6c 65 7d 20 24 6e 5d 0a 7d 0a 0a   purple} $n].}..
06c0: 70 75 74 73 20 7b 2e 70 72 69 6e 74 20 27 3c 68  puts {.print '<h
06d0: 74 6d 6c 3e 27 7d 0a 70 75 74 73 20 7b 2e 70 72  tml>'}.puts {.pr
06e0: 69 6e 74 20 27 3c 73 76 67 20 77 69 64 74 68 3d  int '<svg width=
06f0: 22 31 30 30 30 22 20 68 65 69 67 68 74 3d 22 38  "1000" height="8
0700: 30 30 22 20 73 74 79 6c 65 3d 22 62 6f 72 64 65  00" style="borde
0710: 72 3a 31 70 78 20 73 6f 6c 69 64 20 62 6c 61 63  r:1px solid blac
0720: 6b 22 3e 27 7d 0a 70 75 74 73 20 7b 43 52 45 41  k">'}.puts {CREA
0730: 54 45 20 54 41 42 4c 45 20 74 31 28 70 6f 6c 79  TE TABLE t1(poly
0740: 2c 63 6c 72 29 3b 7d 0a 70 75 74 73 20 7b 43 52  ,clr);}.puts {CR
0750: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 70 6f  EATE TABLE t2(po
0760: 6c 79 2c 63 6c 72 29 3b 7d 0a 66 6f 72 20 7b 73  ly,clr);}.for {s
0770: 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20  et i 0} {$i<30} 
0780: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 70 75 74  {incr i} {.  put
0790: 73 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  s "INSERT INTO t
07a0: 31 28 72 6f 77 69 64 2c 70 6f 6c 79 2c 63 6c 72  1(rowid,poly,clr
07b0: 29 22 0a 20 20 70 75 74 73 20 22 20 56 41 4c 55  )".  puts " VALU
07c0: 45 53 28 24 69 2c 27 5b 72 61 6e 64 6f 6d 73 68  ES($i,'[randomsh
07d0: 61 70 65 31 5d 27 2c 27 5b 72 61 6e 64 6f 6d 63  ape1]','[randomc
07e0: 6f 6c 6f 72 5d 27 29 3b 22 0a 7d 0a 66 6f 72 20  olor]');".}.for 
07f0: 7b 73 65 74 20 69 20 33 30 7d 20 7b 24 69 3c 38  {set i 30} {$i<8
0800: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
0810: 70 75 74 73 20 22 49 4e 53 45 52 54 20 49 4e 54  puts "INSERT INT
0820: 4f 20 74 31 28 72 6f 77 69 64 2c 70 6f 6c 79 2c  O t1(rowid,poly,
0830: 63 6c 72 29 22 0a 20 20 70 75 74 73 20 22 20 56  clr)".  puts " V
0840: 41 4c 55 45 53 28 24 69 2c 27 5b 72 61 6e 64 6f  ALUES($i,'[rando
0850: 6d 73 68 61 70 65 31 5f 73 6d 5d 27 2c 27 5b 72  mshape1_sm]','[r
0860: 61 6e 64 6f 6d 63 6f 6c 6f 72 5d 27 29 3b 22 0a  andomcolor]');".
0870: 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 30 30  }.for {set i 100
0880: 7d 20 7b 24 69 3c 31 30 35 7d 20 7b 69 6e 63 72  } {$i<105} {incr
0890: 20 69 7d 20 7b 0a 20 20 70 75 74 73 20 22 49 4e   i} {.  puts "IN
08a0: 53 45 52 54 20 49 4e 54 4f 20 74 32 28 72 6f 77  SERT INTO t2(row
08b0: 69 64 2c 70 6f 6c 79 2c 63 6c 72 29 22 0a 20 20  id,poly,clr)".  
08c0: 70 75 74 73 20 22 20 56 41 4c 55 45 53 28 24 69  puts " VALUES($i
08d0: 2c 27 5b 72 61 6e 64 6f 6d 73 68 61 70 65 32 5d  ,'[randomshape2]
08e0: 27 2c 27 5b 72 61 6e 64 6f 6d 63 6f 6c 6f 72 5d  ','[randomcolor]
08f0: 27 29 3b 22 0a 7d 0a 0a 70 75 74 73 20 7b 44 45  ');".}..puts {DE
0900: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
0910: 52 45 20 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e 28  RE geopoly_json(
0920: 70 6f 6c 79 29 20 49 53 20 4e 55 4c 4c 3b 7d 0a  poly) IS NULL;}.
0930: 70 75 74 73 20 7b 53 45 4c 45 43 54 20 67 65 6f  puts {SELECT geo
0940: 70 6f 6c 79 5f 73 76 67 28 70 6f 6c 79 2c 0a 20  poly_svg(poly,. 
0950: 20 20 70 72 69 6e 74 66 28 27 73 74 79 6c 65 3d    printf('style=
0960: 22 66 69 6c 6c 3a 6e 6f 6e 65 3b 73 74 72 6f 6b  "fill:none;strok
0970: 65 3a 25 73 3b 73 74 72 6f 6b 65 2d 77 69 64 74  e:%s;stroke-widt
0980: 68 3a 31 3b 22 27 2c 63 6c 72 29 29 0a 20 20 46  h:1;"',clr)).  F
0990: 52 4f 4d 20 74 31 3b 7d 0a 70 75 74 73 20 7b 53  ROM t1;}.puts {S
09a0: 45 4c 45 43 54 20 67 65 6f 70 6f 6c 79 5f 73 76  ELECT geopoly_sv
09b0: 67 28 70 6f 6c 79 2c 0a 20 20 20 70 72 69 6e 74  g(poly,.   print
09c0: 66 28 27 73 74 79 6c 65 3d 22 66 69 6c 6c 3a 6e  f('style="fill:n
09d0: 6f 6e 65 3b 73 74 72 6f 6b 65 3a 25 73 3b 73 74  one;stroke:%s;st
09e0: 72 6f 6b 65 2d 77 69 64 74 68 3a 32 3b 22 27 2c  roke-width:2;"',
09f0: 63 6c 72 29 29 0a 20 20 46 52 4f 4d 20 74 32 3b  clr)).  FROM t2;
0a00: 7d 0a 70 75 74 73 20 7b 2e 70 72 69 6e 74 20 27  }.puts {.print '
0a10: 3c 73 76 67 3e 27 7d 0a                          <svg>'}.