Zadania domowe, zestaw 3

Zadania domowe, zestaw 3#

W tym zestawie zadań proszę przygotować kod, który będzie generował podane poniżej obrazy. Rozwiązując zadania 1-3 można uzyskać 10 pkt. Za rozwiązanie zadań 1-4 otrzymasz 20 pkt. Za rozwiązanie wszystkich 5 zadań otrzymasz 30 pkt. Obrazek generowany przez kod z rozwiązania może różnić się w drobnych szczegółach, ale zasadniczy ‘’temat’’ powinien być zachowany.

Zadanie 1#

pos=0
steps=50
direction=1
length=1
vertices=[]
for _ in range(0,steps):
    vertices.append(pos)
    pos+=length*direction
    direction*=i
    length+=1

line(vertices,aspect_ratio=1,axes=False)
_images/c4ead2a9179740c450a54faf91cf42a895c94557347f051e5aa38288dd39e3b8.png

Zadanie 2#

#wierzchołki
z1 = vector([0,0])
z2 = vector([1,0])
z3 = vector([1/2,sqrt(3)/2])
z4 = vector([-1/2,sqrt(3)/2])
w1 = 1/3*(z1+z2+z3)
w2 = 1/3*(z1+z3+z4)
lat=[vector([1,0]),vector([-1/2,sqrt(3)/2])]

#sciany
faces=[[z1,z2,w1],[z2,z3,w1],[z1,w1,z3],[z1,z3,w2],[z3,z4,w2],[z1,w2,z4]]

def draw_l(li,col):
    return polygon(li+[li[0]],color=col)

def shift_l(li,shift):
    return [x+shift for x in li]

gra=Graphics()
spect=[k/10 for k in range(0,10)]
for i in range(0,5):
    for j in range(0,5):
        for k in range(0,6):
            f=faces[k]
            fmod=shift_l(f,lat[0]*i+lat[1]*j)
            gra+=draw_l(fmod,((k%3)/2,0,0))
    
show(gra,aspect_ratio=1,axes=False)
_images/e8cc6029784e0e9cd47e85706cba3abaed6d8d6a0225f2fb3be69eb1f094d471.png

Zadanie 3#

mot= lambda x,y: arc((x,y),1,1,sector=(0,3/2*pi))+arc((x,y-2),1,1,sector=((2+1/2)*pi,(2-1)*pi))
show(sum(mot(2*k,2*k+4*m) for k in range(0,5) for m in range(0,4)),axes=False,aspect_ratio=1)
_images/db4c18cd7818e537c90c78646f4e380db00c50c586503755b29ae98b9fb6cbe2.png

Zadanie 4#

def F(state,gra): #narysuj linię w kierunku wynaczonym zmienną angle, z punktu (x,y) i o długości l
    pos=state[0]
    angle=state[1]
    l=state[2]
    x=pos[0]
    y=pos[1]
    xend=x+l*cos(angle)
    yend=y+l*sin(angle)
    draw=line([(x,y),(xend,yend)],axes=False,aspect_ratio=1)
    gra=gra+draw
    return [[xend,yend],angle,l],gra

def f(state,gra): #przesuń się nad płaszczyzną o linię w kierunku wynaczonym zmienną angle, z punktu (x,y) i o długości l
    pos=state[0]
    angle=state[1]
    l=state[2]
    x=pos[0]
    y=pos[1]
    xend=x+l*cos(angle)
    yend=y+l*sin(angle)
    return [[xend,yend],angle,l],gra

def a(state,gra,delta): #obróć się o kąt delta
    pos=state[0]
    angle=state[1]
    l=state[2]
    x=pos[0]
    y=pos[1]
    return [[x,y],angle+delta,l],gra

def ApplyRule(str1,replrule): #zastosowanie reguł ze słownika replrule
    return''.join([replrule[x] for x in str1])

def DrawPatt(str1,state,gra,angle):
    while len(str1) >0:
        s=str1[0]
        schop=str1[1:len(str1)]
        if s=="F":
            state,gra=F(state,gra)
        if s=="f":
            state,gra=f(state,gra)
        if s=="p":
            state,gra=a(state,gra,angle)
        if s=="m":
            state,gra=a(state,gra,-angle)
        str1=schop
    return state,gra


axiom="F" 
replrule={"F":"FpFmFmFpF", "p":"p","m":"m"}

state0=[[0,0],0,1]
gra0=Graphics()


#Iteracje funkcji
def f1(s,n):
    while n>0:
        s,n=ApplyRule(s,replrule),n-1
    return s


_,qq=DrawPatt(f1(axiom,4),state0,gra0,pi/2.3)
show(qq,axes=False,aspect_ratio=1,figsize=[10,10])
_images/9c9a523f1a5a467a21bfcfaa2aba4969f25b33b2093cf2015a81bfd5b19ebd93.png

Zadanie 5#

#inspirowane pracą Robert W. Fathauer, Computers & Graphics 25 (2001)
#https://doi.org/10.1016/S0097-8493(00)00134-5
def rotate(v,theta):
    m=matrix(2,2,[cos(theta),-sin(theta),sin(theta),cos(theta)])
    return m*v

def rotate_l(li,theta):
    return [rotate(v,theta) for v in li]

def draw_l(li,col='green'):
    return polygon(li+[li[0]],color=col)
def scale_l(li,scale):
    return [scale*v for v in li]
def shift_l(li,shift):
    return [v+shift for v in li]
def rot_at_p(li,theta,p):
    li2=shift_l(li,-p)
    li2=rotate_l(li2,theta)
    return shift_l(li2,p)
def reflect(p0,p,re):
    pp=p0-p
    rp=vector([-re[1],re[0]])
    return pp-(2*(pp*rp)/(rp*rp))*rp+p
def reflect_l(li,p,re):
    return [reflect(v,p,re) for v in li]
    

v1=vector([0,0])
v2=vector([cos(pi/2-pi/8),sin(pi/2-pi/8)])
v3=v2+(tan(pi/8))*rotate(v2,pi/2)
v4=vector([-v2[0],v2[1]])

ksztalt=rotate_l([v1,v2,v3,v4],-pi/8)

def Sgen(n):
    instr='dddd'
    end='k'
    for i in range(0,n):
        newend=end+'dk'
        instr=instr+end+instr+end+instr
        end=newend
    return instr+end

def Odbicie(symb,fig,orient):
    if symb=='d':
        return reflect_l(fig,fig[orient[0]],fig[orient[3]]-fig[orient[0]]),[orient[0],orient[3],orient[2],orient[1]]
    else:
        return reflect_l(fig,fig[orient[3]],fig[orient[3]]-fig[orient[2]]),[orient[0],orient[3],orient[2],orient[1]]
gra=Graphics()
ksztaltn=[vector([v[0].n(),v[1].n()]) for v in ksztalt]
for c in range(0,8):
    gra = draw_l(rotate_l(ksztaltn,c*(pi/4).n()),(0,0,c%2)) + gra
    
k2=scale_l(ksztaltn,(sqrt(2)-1).n())
k2=rotate_l(k2,(-pi/2).n())
k2=shift_l(k2,ksztaltn[2])
k2b=k2

gra=draw_l(k2,(1,0,1))+gra

gg=Sgen(0)
orient=[0,1,2,3]
c=1
for _ in range(0,8):
    for s in gg:
        c+=1
        k2,orient=Odbicie(s,k2,orient)
        gra = draw_l(k2,(1,0,(c%2)))+gra

n=6
for i in range(2,n):
    k2=scale_l(ksztaltn,((sqrt(2)-1)^(i)).n())
    k2=rotate_l(k2,(-(1+(i-3)/4)*pi).n())
    k2=shift_l(k2,rot_at_p(k2b,(pi/4).n(),k2b[0])[2])
    c=1
    gra+=draw_l(k2,((n-i)/n,0,(c%2)/2))

    k2b=k2
    gg=Sgen(i-1)
    orient=[0,1,2,3]
    for _ in range(0,8):
        for s in gg:
            c+=1
            k2,orient=Odbicie(s,k2,orient)
            gra=draw_l(k2,((n-i)/n,0,(c%2)/2))+gra

show(gra,aspect_ratio=1,axes=False,figsize=[10,10])
_images/fa5865ba81c1ed301ad3a27f2330b1fea98f80a41d039c736deb08fb6897f7e8.png