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

Stronę tą wyświetlono już: 747 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:

Listing 1
  1. #!/usr/bin/env python
  2. import math as mt
  3. ray = float(input("Podaj promień sfery: "))
  4. numberOfCuts = int(input("Podaj liczbę podziału (4-32): "))
  5. if numberOfCuts < 4:
  6. numberOfCuts = 4
  7. elif numberOfCuts > 32:
  8. numberOfCuts = 32
  9. angle = mt.pi * 2 / numberOfCuts
  10. width = mt.pi * 2 * ray / numberOfCuts
  11. height = mt.pi * ray
  12. startAngle = - mt.pi / 2
  13. print("Wysokość rozwinięcia sferycznego: ", height)
  14. draw = "M"
  15. draw2 = "L"
  16. for i in range(0, 181):
  17. r = mt.cos(startAngle + i * mt.pi / 180) * ray
  18. h = (startAngle + i *mt.pi / 180) * ray
  19. dy = h
  20. dx = r * angle/2
  21. if i != 0:
  22. draw += "L"
  23. draw2 += "L"
  24. draw += str(dx) + "," + str(dy)
  25. draw2 += str(-dx) + "," + str(-dy)
  26. if i != 180:
  27. draw += " "
  28. draw2 += " "
  29. svgFile = open("sphere.svg", "w")
  30. svgFile.write("""<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  31. <!-- Created with Python 3.4 script made by owner of page obliczeniowo.com.pl/945 -->""")
  32. svgFile.write("<svg width=\"" + str(mt.pi * 2 * ray) + "\" height=\"" + str(height) + "px\">")
  33. for i in range(0, numberOfCuts):
  34. svgFile.write("<path d=\"")
  35. svgFile.write(draw + " " + draw2)
  36. svgFile.write("\" transform=\"translate(" + str(width * i + width / 2 ) + " " + str(height / 2) + ")\" style=\"stroke:#000000;fill:none;stroke-width:" + str(100 / ray) + "\"></path>")
  37. 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.

Komentarze