/[cvs]/fract/mandelzoom.cgi
ViewVC logotype

Diff of /fract/mandelzoom.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.9 by teddy, Tue Jun 19 22:27:27 2001 UTC revision 1.10 by teddy, Tue Jun 26 12:43:34 2001 UTC
# Line 4  import cgi, Image, ImageDraw, sys, math, Line 4  import cgi, Image, ImageDraw, sys, math,
4  from string import atoi, atof  from string import atoi, atof
5    
6  def handler(signum, frame):  def handler(signum, frame):
7        signal.alarm(0)
8      raise os.error, (errno.ETIME, "Timer expired")      raise os.error, (errno.ETIME, "Timer expired")
9    
10  signal.alarm(55)  signal.alarm(55)
# Line 41  if form.has_key('cy'): Line 42  if form.has_key('cy'):
42  else:  else:
43      cy= 0.0      cy= 0.0
44    
45    # The length of the diagonal line from corner to corner.
46    # Used as a measure of image size independent of aspect ratio.
47  if form.has_key('diag'):  if form.has_key('diag'):
48      diag= atof(form['diag'].value)      diag= atof(form['diag'].value)
49  else:  else:
# Line 74  if not (form.has_key('type') and form['t Line 77  if not (form.has_key('type') and form['t
77          ds="&debug=on"          ds="&debug=on"
78      else:      else:
79          ds=""          ds=""
80        # If the user has selected a specific point on the image
81      if form.has_key('image.x') and form.has_key('image.y'):      if form.has_key('image.x') and form.has_key('image.y'):
82          # Adjust cx and cy          # Adjust cx and cy
83          ix= atof(form['image.x'].value)          ix= atof(form['image.x'].value) # Intermediate value
84          iy= atof(form['image.y'].value)          iy= atof(form['image.y'].value) # Intermediate value
85          owidth= atof(form['owidth'].value)          owidth= atof(form['owidth'].value)
86          oheight= atof(form['oheight'].value)          oheight= atof(form['oheight'].value)
87          diagp= math.sqrt(owidth**2 + oheight**2)          diagp= math.sqrt(owidth**2 + oheight**2) # Intermediate value
88          scale= diagp/diag          scale= diagp/diag               # Intermediate value
89          cx= (ix/scale) + (cx - (owidth / (scale*2)))          cx= (ix/scale) + (cx - (owidth / (scale*2)))
90          cy= ((oheight-iy)/scale) + (cy - (oheight / (scale*2)))          cy= ((oheight-iy)/scale) + (cy - (oheight / (scale*2)))
91      if form.has_key('zoom'):      if form.has_key('zoom'):
92          zoom=atof(form['zoom'].value)          zoom=atof(form['zoom'].value)
93          diag=diag/zoom          diag=diag/zoom
94      else:      else:
95          # If no zoom provided, don't actually zoom          # If no zoom provided, don't actually zoom, but keep the
96            # default of ×2 zoom.
97          zoom= 2.0          zoom= 2.0
98      print 'SRC="mandelzoom.cgi?type=image&width=%s&height=%s&iter=%s%s&diag=%s&cx=%s&cy=%s"' % (str(width), str(height), str(maxiter), ds, str(diag), str(cx), str(cy)),      print 'SRC="mandelzoom.cgi?type=image&width=%s&height=%s&iter=%s%s&diag=%s&cx=%s&cy=%s"' % (str(width), str(height), str(maxiter), ds, str(diag), str(cx), str(cy)),
99      print 'ALIGN=BOTTOM HEIGHT="%s"' % (str(height)),      print 'ALIGN=BOTTOM HEIGHT="%s"' % (str(height)),
# Line 127  if not (form.has_key('type') and form['t Line 132  if not (form.has_key('type') and form['t
132  After changing any settings, don't forget to change the "Zoom" setting  After changing any settings, don't forget to change the "Zoom" setting
133  to "Pan" if you don't want to zoom when applying them.  to "Pan" if you don't want to zoom when applying them.
134  </BODY></HTML>"""  </BODY></HTML>"""
135        # Just exit, don't calculate an image.
136      sys.exit(0)      sys.exit(0)
137    
138    # c1 and c2 are the coordinates of two opposite corners.
139  # Figure out c1 and c2 from width, height, diag, cx, and cy.  # Figure out c1 and c2 from width, height, diag, cx, and cy.
140    
141  # Diagonal in pixels  # Diagonal in pixels
142  diagp= math.sqrt(width**2 + height**2)  diagp= math.sqrt(width**2 + height**2)
143  # Scale between pixels and coordinates  # Scale between pixels and coordinates
144  scale= diagp/diag  scale= diagp/diag
145    # half the width/height in real numbers; intermediate values
146  x= (width/2.0)/scale  x= (width/2.0)/scale
147  y= (height/2.0)/scale  y= (height/2.0)/scale
148    
149    # The coordinates of two opposite corners
150  c1= cx - x + (cy - y) * (0+1j)  c1= cx - x + (cy - y) * (0+1j)
151  c2= cx + x + (cy + y) * (0+1j)  c2= cx + x + (cy + y) * (0+1j)
152    
153  #print width, height, diag, cx, cy, diagp, scale, x, y, c1, c2  #print width, height, diag, cx, cy, diagp, scale, x, y, c1, c2
154  #sys.exit(0)  #sys.exit(0)
155    
 #c1, c2 = (-2+2j), (2-2j)                # Corner coordinates  
   
156  # Force c1 to be upper left and c2 to be lower right  # Force c1 to be upper left and c2 to be lower right
157  c1, c2= complex(min(c1.real, c2.real), max(c1.imag, c2.imag)), \  c1, c2= complex(min(c1.real, c2.real), max(c1.imag, c2.imag)), \
158          complex(max(c1.real, c2.real), min(c1.imag, c2.imag))          complex(max(c1.real, c2.real), min(c1.imag, c2.imag))
159    
160    # New image object
161  mandel= Image.new("L", (width, height))  mandel= Image.new("L", (width, height))
162    # shortcut to the "Draw" method on the image object
163  draw= ImageDraw.Draw(mandel)  draw= ImageDraw.Draw(mandel)
164    
165  def drawrect((x1, y1), (x2, y2)):  def drawrect((x1, y1), (x2, y2)):
# Line 211  def drawrect((x1, y1), (x2, y2)): Line 221  def drawrect((x1, y1), (x2, y2)):
221                  draw.rectangle([x1, y1m, x2, y2m], fill= color)                  draw.rectangle([x1, y1m, x2, y2m], fill= color)
222    
223  def constant(x, y):  def constant(x, y):
224        "Return complex number from pixel coordinates x and y."
225      creal= (float(x)/xmax)*(c2.real - c1.real)+c1.real      creal= (float(x)/xmax)*(c2.real - c1.real)+c1.real
226      cimag= (float(y)/ymax)*(c2.imag - c1.imag)+c1.imag      cimag= (float(y)/ymax)*(c2.imag - c1.imag)+c1.imag
227      return complex(creal, cimag)      return complex(creal, cimag)
# Line 260  try: Line 271  try:
271  except os.error, the_error:  except os.error, the_error:
272      if the_error[0] != errno.ETIME:      if the_error[0] != errno.ETIME:
273          raise os.error, the_error          raise os.error, the_error
274            
275  signal.alarm(0)  signal.alarm(0)
276    
277  print "Content-type: image/png"  print "Content-type: image/png"

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26