1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9  import Image, ImageDraw 
 10  import random 
 11  import math 
 12   
 13  import subdivision 
 14  import sys 
 15  sys.path.append(r"e:\dev") 
 16  from MeatEngine.Math.vector import Vec2f 
 17   
 18  EPSILON=0.001 
 19  imX=2400 
 20  imY=3000 
 21   
 22  greenGrass=(128,255,128) 
 23  greyGreen=(100,240,100) 
 24   
 25  backgroundColor=(255,255,255) 
 26  adjacencyColor=(180,240,240) 
 27   
 28   
 30      """ 
 31      From a post by Dave Watson: 
 32       
 33      This approach uses Cramer's Rule to find the intersection of two 
 34      perpendicular bisectors of triangle edges 
 35   
 36       
 37      p_0 = (((a_0 - c_0) * (a_0 + c_0) + (a_1 - c_1) * (a_1 + c_1)) / 2 * (b_1 - c_1)  
 38      -  ((b_0 - c_0) * (b_0 + c_0) + (b_1 - c_1) * (b_1 + c_1)) / 2 * (a_1 - c_1))  
 39      / D 
 40   
 41      p_1 = (((b_0 - c_0) * (b_0 + c_0) + (b_1 - c_1) * (b_1 + c_1)) / 2 * (a_0 - c_0) 
 42      -  ((a_0 - c_0) * (a_0 + c_0) + (a_1 - c_1) * (a_1 + c_1)) / 2 * (b_0 - c_0)) 
 43      / D 
 44   
 45      where D = (a_0 - c_0) * (b_1 - c_1) - (b_0 - c_0) * (a_1 - c_1) 
 46   
 47      The _squared_ circumradius is then: 
 48   
 49      r^2 = (c_0 - p_0)^2 + (c_1 - p_1)^2 
 50      """ 
 51   
 52      d = (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y) 
 53   
 54      if abs(d) < EPSILON: 
 55          return ((p1.x+p2.x+p3.x)/3, 
 56                  (p1.y+p2.y+p3.y)/3) 
 57   
 58      x = (((p1.x - p3.x) * (p1.x + p3.x) + (p1.y - p3.y) * (p1.y + p3.y)) / 2 * 
 59           (p2.y - p3.y) - 
 60           ((p2.x - p3.x) * (p2.x + p3.x) + (p2.y - p3.y) * (p2.y + p3.y)) / 2 * 
 61           (p1.y - p3.y)) / d 
 62   
 63      y = (((p2.x - p3.x) * (p2.x + p3.x) + (p2.y - p3.y) * (p2.y + p3.y)) / 2 * (p1.x - p3.x) 
 64           -  ((p1.x - p3.x) * (p1.x + p3.x) + (p1.y - p3.y) * (p1.y + p3.y)) / 2 * (p2.x - p3.x))/ d 
 65       
 66      return x,y 
  67   
 68       
 69           
 70       
 72      for p1 in points: 
 73          dx=p1[0]-p[0] 
 74          dy=p1[1]-p[1] 
 75   
 76          distSqr=dx*dx+dy*dy 
 77          if distSqr<rSqr: 
 78              return False 
 79      return True 
  80           
 81       
 82  if __name__=="__main__": 
 83      im=Image.new("RGB",(imX,imY),backgroundColor) 
 84      draw=ImageDraw.ImageDraw(im) 
 85   
 86      points=[] 
 87       
 88      radius=60 
 89      numPts=15000 
 90       
 91       
 92      p1=Vec2f(-100.0,-100.0) 
 93      p2=Vec2f(3.0*imX,0.0) 
 94      p3=Vec2f(0.0,3.0*imY) 
 95       
 96      s=subdivision.Subdivision(p1,p2,p3) 
 97   
 98      for i in range(numPts): 
 99          print i 
100          x=float(random.randrange(imX)) 
101          y=float(random.randrange(imY)) 
102       
103          rSqr=radius*radius 
104           
105          p=(x,y) 
106          if pointIsValid(p,rSqr): 
107              points.append(p) 
108              s.insertSite(Vec2f(x,y)) 
109              im.putpixel(p,(0,0,0)) 
110   
111       
112      e=s.dumpEdges() 
113      for edge in e: 
114          o=edge.org() 
115          d=edge.dest() 
116          q1=edge.lNext().dest() 
117          q2=edge.sym.lNext().dest() 
118       
119          x1,y1=findCircumCenter(o,d,q1) 
120          x2,y2=findCircumCenter(o,d,q2) 
121           
122          draw.line((o.x, o.y, d.x, d.y), adjacencyColor) 
123          draw.line((x1, y1, x2, y2), (0,0,0)) 
124       
125      del draw 
126       
127      im.save("map.jpg") 
128