#!/usr/bin/python

import cgi
import cgitb
cgitb.enable()

form = cgi.FieldStorage()

def get_int_param(name, default):
    val = form.getvalue(name)
    if (val is None):
        return default
    return int(val)


def draw_circle(cx, cy, r):
    return '<circle cx="%f" cy="%f" r="%f" style="fill: none; stroke: #000000; " stroke-width="%d" />' % (cx, cy, r, 1)


def draw_circle_fractal(cx, cy, r, depth):
    result = draw_circle(cx, cy, r);
    if (depth > 0):
        r2 = r * 0.464101615
        r3 = r2 * 0.5773502690
        result = result + draw_circle_fractal(cx, cy - r + r2, r2, depth - 1)
        result = result + draw_circle_fractal(cx - r2, cy + r3, r2, depth - 1)
        result = result + draw_circle_fractal(cx + r2, cy + r3, r2, depth - 1)
    return result

print """Content-type: image/svg+xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   viewBox="0 0 600 600"
   version="1.1"
   height="600"
   width="600">
  <g>%s</g>
</svg>
""" % draw_circle_fractal(300300300, get_int_param("depth"4));

http://apocalypse.rulez.org/~upi/surba/circles.py?depth=2 [source]
http://apocalypse.rulez.org/~upi/surba/circles.py?depth=6 [source]
(Lehetőleg 6 feletti mélységben NE, mert megdöglik a számítógép!)

Hát húha. Itt egy csomó minden történt, ami eddig nem történt. Én meg nem szeretem, ha a dolgok másmilyenek! Lássuk, mi minden újdonsággal szolgál a mai csoda!

Függvények: Eddig csak a Python saját beépített függvényeit használtuk fel, mint pl az int, valamint a könyvárból előcsemegézett függvényeket, mint a cgi.FieldStorage. Eljött most az ideje, hogy sajátokat is csináljunk. Például, a get_int_param azt a bravúrt oldja meg nekünk, hogy beolvas és rögtön egész számmá alakít egy paramétert nekünk, ha pedig hiányozna (None az értéke), akkor egy alapértelmezett számot ad vissza helyette.

Ráadásul a függvények más függvényeket is meg tudnak hívni, például a draw_circle_fractal meghívja a draw_circle nevűt. Ha egy függvény pedig önmagát hívja meg, akkor azt rekurzív függvénynek hívjuk, és rettegünk tőle, hogy nehogy végtelen ciklust eredményezzen.

String formattálás: Eddig stringeket csak a + operátorral rakosgattunk össze. Van egy kényelmesebb módszer is: a formattálás, ami a stringet követő % operátorral működik. Fedezzük fel ennek a rejtelmeit!

Feladatok

  • Mi a szent szar a 0.464101615 és 0.5773502690? Ezek hogyan jöttek ki az UPinak?
  • Legyen paraméterezhető a körök vonalvastagsága, alapértelmezetten legyen 1.
  • A páros mélységben található köröket töltsük ki kék, a páratlanokat zöld színnel.
  • Ne három kör legyen egyben, hanem négy.
  • Bónusz feladat: Ne is, inkább öt!
  • Bónuszabb feladat: Rajzoljuk ki a Koch-görbét.
  • Legbónuszabb feladat: Rajzoljuk ki a Sárkány-görbét.
Utoljára módosította UPi 2017.VI.29 18:12-n
Bejegyzés módosítása | PermaLink
Votes disabled.

Hozzászólások (2)

SAdam hozzászólása 2017-06-30 01:18-kor

Kis lefekvés előtti agytorna, de ha jól sejtem, akkor 1 = r2 + r2/cos(30) az egyik, és tan(30) a másik...

Válaszkérdés: kérek egy egysoros (igazából egyszavas) bizonyítást a következő két állításra: depth = 1 esetben 3 "beírt" kör van, az egymást érintő körök érintési pontjaiba az érintőket behúzva kapunk három egyenest. Ezek
(1) egy pontban metszik egymást, mégpedig
(2) az eredeti (nagy) kör középpontjában.
Miért?

(Persze lehet, hogy másnak triviális lesz az egyszavas válasz, nekem így hajnalban kellett rajta gondolkodnom egy kicsit.)


UPi hozzászólása 2017-06-30 16:32-kor

(Válaszképp erre)

Ha egyszavas választ kell adnom, akkor a "csak".
Ha két szó is megengedett, akkor "Szimmetria okokból". (És ez tényleg.)

Tagek: