Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- import sys
- from math import pi, sin, cos, tan, asin, acos, atan, sqrt
- def arc(fromx, fromy, tox, toy, radius, sweep):
- global x0, y0
- return '<path stroke="#000" stroke-width="2" fill="none" d="M%.3f,%.3f A%.3f,%.3f,0,0,%d,%.3f,%.3f" />'"n" % (x0+fromx, y0-fromy, radius, radius, sweep, x0+tox, y0-toy)
- def line(fromx, fromy, tox, toy):
- global x0, y0
- return '<path stroke="#000" stroke-width="2" fill="none" d="M%.3f,%.3f L%.3f,%.3f" />'"n" % (x0+fromx, y0-fromy, x0+tox, y0-toy)
- def linevia(fromx, fromy, viax, viay, tox, toy):
- global x0, y0
- return '<path stroke="#000" stroke-width="2" fill="none" d="M%.3f,%.3f L%.3f,%.3f %.3f,%.3f" />'"n" % (x0+fromx, y0-fromy, x0+viax, y0-viay, x0+tox, y0-toy)
- if __name__ == '__main__':
- # Parse parameters
- if len(sys.argv) >= 5 and len(sys.argv) <= 7:
- w = float(sys.argv[1])
- t = float(sys.argv[2])
- r1 = float(sys.argv[3])
- r2 = float(sys.argv[4])
- if len(sys.argv) >= 6:
- beta = float(sys.argv[5]) * pi / 180.0
- if beta > 0.0 and len(sys.argv) >= 7:
- b = float(sys.argv[6])
- else:
- b = 0.0
- else:
- beta = 0.0
- b = 0.0
- else:
- sys.stderr.write("n"
- "Usage: %s width thickness lowerradius upperradius [ apexangle [ apexwidth ] ] > output.svgn"
- "n"
- "If specified, the apex angle is in degrees.n"
- "n" % sys.argv[0])
- sys.exit(1)
- # The base angle (lower arc angle) is phi:
- phi = pi - acos( (0.5*(w-b) - r1 - t - r2*cos(0.5*beta)) / (r1 + t + r2))
- x1 = 0.5*w - t - r1
- x2 = x1 + (r1 + t + r2)*cos(phi)
- y2 = (r1 + t + r2)*sin(phi)
- w1 = 0.5*b
- w2 = x1 + r1*cos(phi)
- w3 = x1 + (r1+t)*cos(phi)
- h1 = r1*sin(phi)
- h2 = (r1+t)*sin(phi)
- h3 = y2 - (r2 + t)*sqrt(1 - (x2*x2)/((r2+t)*(r2+t)))
- h5 = y2 - r2*sin(0.5*beta)
- h4 = h5 - 0.5*b*tan(0.5*beta)
- if beta > 0.0:
- h = h5 + 0.5*b/tan(0.5*beta)
- else:
- h = h5
- w0 = x1
- w4 = x1 + r1
- w5 = x1 + r1 + t
- pixelwidth = round(2*t + w)
- pixelheight = round(2*t + h)
- x0 = int(pixelwidth / 2)
- y0 = int(round(h + t))
- sys.stdout.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' "n"
- '<svg xmlns="http://www.w3.org/2000/svg" width="%d" height="%d" viewBox="0 0 %d %d" >' "n" % (pixelwidth, pixelheight, pixelwidth, pixelheight))
- sys.stdout.write('<rect x="0" y="0" width="%d" height="%d" stroke="none" fill="#fff" />' "n" % (pixelwidth, pixelheight))
- # Left-side lower outer arc
- sys.stdout.write(arc( -w5,0, -w3,h2, r1+t, 1 ))
- # Left-side upper outer arc
- sys.stdout.write(arc( -w3,h2, -w1,h5, r2, 0 ))
- # Cap
- if w1 > 0:
- sys.stdout.write(linevia( -w1,h5, 0,h, w1,h5 ))
- # Right-side upper outer arc
- sys.stdout.write(arc( w1,h5, w3,h2, r2, 0 ))
- # Right-side lower outer arc
- sys.stdout.write(arc( w3,h2, w5,0, r1+t, 1 ))
- # Right-side lower inner arc
- sys.stdout.write(arc( w4,0, w2,h1, r1, 0 ))
- # Right-side upper inner arc
- sys.stdout.write(arc( w2,h1, 0,h3, r2+t, 1 ))
- # Left-side upper inner arc
- sys.stdout.write(arc( 0,h3, -w2,h1, r2+t, 1 ))
- # Left-size lower inner arc
- sys.stdout.write(arc( -w2,h1, -w4,0, r1, 0 ))
- # Arc separator lines
- sys.stdout.write(line( -w2,h1, -w3,h2 ))
- sys.stdout.write(line( w2,h1, w3,h2 ))
- sys.stdout.write(line( 0,h4, 0,h3 ))
- sys.stdout.write(line( -w5,0, -w4,0 ))
- sys.stdout.write(line( w5,0, w4,0 ))
- # Cap bottom
- if w1 > 0:
- sys.stdout.write(linevia( -w1,h5, 0,h4, w1,h5 ))
- sys.stdout.write("</svg>n")
- python ogee.py 800 10 500 600 45 15 > out.svg
Add Comment
Please, Sign In to add comment