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

Diff of /fract/mandelzoom.cgi

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

revision 1.7 by teddy, Mon Feb 26 05:31:47 2001 UTC revision 1.10 by teddy, Tue Jun 26 12:43:34 2001 UTC
# Line 1  Line 1 
1  #!/usr/bin/python  #!/usr/bin/python
2    
3  import cgi, Image, ImageDraw, sys, math  import cgi, Image, ImageDraw, sys, math, signal, errno, os
4  from string import atoi, atof  from string import atoi, atof
5    
6    def handler(signum, frame):
7        signal.alarm(0)
8        raise os.error, (errno.ETIME, "Timer expired")
9    
10    signal.alarm(55)
11    signal.signal(signal.SIGALRM, handler)
12    
13  # This is to get backtrace output  # This is to get backtrace output
14  sys.stderr = sys.stdout  sys.stderr = sys.stdout
15    
# Line 35  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 68  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 117  if not (form.has_key('type') and form['t Line 128  if not (form.has_key('type') and form['t
128          print '<INPUT TYPE=HIDDEN NAME="%s" VALUE="%s">' % var          print '<INPUT TYPE=HIDDEN NAME="%s" VALUE="%s">' % var
129      print '<INPUT TYPE=HIDDEN NAME=type VALUE="html">'      print '<INPUT TYPE=HIDDEN NAME=type VALUE="html">'
130    
131      print """</FORM>      print """</FORM><P>
132    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.
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 203  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 247  if c1.imag > 0 and c2.imag < 0: # the x Line 266  if c1.imag > 0 and c2.imag < 0: # the x
266      else:      else:
267          yto= yorig # End at x axis          yto= yorig # End at x axis
268    
269  drawrect((0, yfrom), (xmax, yto))  try:
270        drawrect((0, yfrom), (xmax, yto))
271    except os.error, the_error:
272        if the_error[0] != errno.ETIME:
273            raise os.error, the_error
274    
275    signal.alarm(0)
276    
277  print "Content-type: image/png"  print "Content-type: image/png"
278  print  print

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

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26