Skrypt generujący plik SVG rozwinięcia siatki powierzchni kuli

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 8350 razy

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.

Konstrukcja umożliwiająca uzyskanie rozwinięcia siatki sfery
Rys. 1
Konstrukcja umożliwiająca uzyskanie rozwinięcia siatki sfery

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.

Wynik działania programu do generowania siatki rozwinięcia powierzchni kuli
Rys. 2
Wynik działania programu do generowania siatki rozwinięcia powierzchni kuli dla parametrów R = 100 i liczby cięć = 8.
Propozycje książek