Prosty skrypt Python-a, który generuje plik SVG na podstawie promienia R kuli oraz liczby cięć siatkę rozwinięcia powierzchni tejże kuli. Konstrukcja wykorzystana do uzyskania takiego efektu została rozrysowana na poniższej ilustracji.
Na powyższej ilustracji okrąg stanowiący osiowy przekrój kuli podzieliłem sobie na 12 równych części. Każda część ma łuk długości równej L1-2, dla której wzór na długość został napisany na powyższej ilustracji. Ta sama długość będzie stanowiła odległość pomiędzy liniami siatki, na której rozwinięcie pojedynczego elementu siatki będzie rysowane. Konieczne jest jeszcze znalezienie długości łuków zaznaczonych na prawym rysunku, czyli LA-B, LB-C i LD-E, albowiem za prawdę powiadam, że ich długość odpowiada szerokości rozwinięcia na danej wysokości.
Kod programu wygląda następująco:
#!/usr/bin/env python
import math as mt
ray = float(input("Podaj promień sfery: "))
numberOfCuts = int(input("Podaj liczbę podziału (4-32): "))
if numberOfCuts < 4:
numberOfCuts = 4
elif numberOfCuts > 32:
numberOfCuts = 32
angle = mt.pi * 2 / numberOfCuts
width = mt.pi * 2 * ray / numberOfCuts
height = mt.pi * ray
startAngle = - mt.pi / 2
print("Wysokość rozwinięcia sferycznego: ", height)
draw = "M"
draw2 = "L"
for i in range(0, 181):
r = mt.cos(startAngle + i * mt.pi / 180) * ray
h = (startAngle + i *mt.pi / 180) * ray
dy = h
dx = r * angle/2
if i != 0:
draw += "L"
draw2 += "L"
draw += str(dx) + "," + str(dy)
draw2 += str(-dx) + "," + str(-dy)
if i != 180:
draw += " "
draw2 += " "
svgFile = open("sphere.svg", "w")
svgFile.write("""<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Python 3.4 script made by owner of page obliczeniowo.com.pl/945 -->""")
svgFile.write("<svg width=\apos" + str(mt.pi * 2 * ray) + "\apos height=\apos" + str(height) + "px\apos>")
for i in range(0, numberOfCuts):
svgFile.write("<path d=\apos")
svgFile.write(draw + " " + draw2)
svgFile.write("\apos transform=\apostranslate(" + str(width * i + width / 2 ) + " " + str(height / 2) + ")\apos style=\aposstroke:#000000;fill:none;stroke-width:" + str(100 / ray) + "\apos></path>")
svgFile.write("</svg>")
Poniżej zamieszczam przykład pliku SVG rozwinięcia siatki sfery.
Rys. 2
Wynik działania programu do generowania siatki rozwinięcia powierzchni kuli dla parametrów R = 100 i liczby cięć = 8.