Wykład 5: Visual Python
Andrzej Krajka
Biblioteka numpy
Numpy
rozszerzenie PYTHONa do wielowymiarowych tablic (wzorowane na MATLABie)
bliska C wydajność
adresowana do obliczeń naukowych Obiekty:
- array([[0.1, 1, 2.1], [3.1, 4, 5]])
(ones(2,3), zeros(4), diag(array([1,2,3,4])))
typy int64. float64, complex128, Operacje na macierzach:
Ze skalarem: 2**a, a+1, a*3
Macierzowo: a+b, a-b, a.dot(b),
Punktowo: a*b, a==b, a|b, a&b
Wektory w VPYTHONie
Trójwymiarowe np.
v1=vector(1.1,2,5) v2=vector(3,1) # (3,1,0)
do współrzędnych odwołujemy się v1.x, v1.y, v1.z lub v1[0]
Wektory można:
v1+v2 - dodawać
2*v1 - mnożyć przez skalar mag(v1) - długość wektora v1
mag2(v1) - długość do kwadratu wektora v1 norm(v1) - wektor unormowany (=v1/mag(v1))
v1.diff_angle(v2) – kąt pomiędzy wektorami v1 i v2 cross(v1,v2) – iloczyn wektorowy (v1 x v2)
dot(v1,v2) – iloczyn skalarny v1 i v2 (v1 ° v2)
v2=rotate(v1, angle=theta, axis=(1,1,1)) – obrót o kąt wektora wokół osi
2 2
2
1 . 1 .
.
1 x v y v z
v
Vpython – dodatkowe informacje
Tworzenie i usuwanie obiektów:
ball.visble=0 ball.visible=True Szybkość animacji:
rate(n) – n obrotów pętli na sekundę Kolory:
RGB c=(1,1,0)
mnemoniki color.red, color.green, color.blue,
color.magenta, color.yellow, color.orange, color.cyan, color.black, color.white
C1=color.rgb_to_hsv(C2)
C2=color.hsv_to_rgb(C1)
Obiekt cylinder
rod=cylinder(pos=(0,2,1), axis=(5,0,0),radius=1) rod.color = (0,0,1)
rod.red = 0.4
rod.green = 0.7
rod.blue = 0.8
rod.pos = (2,2,-1)
Obiekt arrow
rod=arrow(pos=(0,2,1),axis=(5,0,0), shafwidth=1)
Obiekt cone
rod=cone(pos=(5,2,0), axis=(12,0,0), radius=1)
Obiekt pyramid
rod=pyramid(pos=(5,2,0), size=(12,6,4))
Obiekt sphere
rod=sphere(pos=(5,2,0), radius=6)
Obiekt ring
rod=ring(pos=(1,1,1), axis=(0,1,0), radius=0.5,
thickness=0.1)
Obiekt box
rod=box(pos=(3,5,2), length-4, height=3, width=4)
Obiekt ellipsoid
rod=ellipsoid(pos=(3,5,2), length-4, height=3,
width=4)
Obiekt convex
rod=convex(pos=[(3,5,2), (2,5,1), …])
Punkty które powodują, że figura nie jest wypukła są odrzucane
Punkty mogą być dodawane kolejno (metoda append z parametrami pos, color itp.), zadane parametrycznie:
t=arange(1,10,1) pos=(sin(t), 1/(1.0+t*t), exp(-t)) lub
x=arange(1,10,1) rod.y=sin(x) rod.z=cos(x)
Obiekt curve
rod=curve(pos=[(3,5,2), (2,5,1), …])
Podobnie jak convex – 2D lub 3D punkty na których rozpina
się krzywą
Shape library
rt = shapes.rectangle(pos=(-2,3), width=5, height=3, rotate=pi/6, roundness=0.1, invert=False, scale=2, thickness=0.1)
cr = shapes.circle(radius=2, np=64) el = shapes.ellipse(width=5, height=3)
ar = shapes.arc(radius=2, angle1=0, angle2=pi/2) tr = shapes.triangle(length=5)
pt = shapes.pentagon(length=5) hx = shapes.hexagon(length=5)
poly = shapes.ngon(np=7, length=5) st = shapes.star(n=5)
tr=shapes.trapezoid(pos=(-2,3), width=5, height=1, top=3) st = paths.cross(width=10, thickness=2)
pl = shapes.pointlist(points=[(1,0),(1,1),(-2,3),(1,0)],rotate=pi/4) pl = shapes.text(text="Hello!")
g = shapes.gear()
Obiekt extrusion
ex = extrusion(pos=..., shape=...)
Wtłaczanie 2D wymiarowego obiektu wokół 3D wymiarowego kształtu
1. Utwórz 2D wymiarowy kształt (lub skorzystaj z biblioteki shapes)
2. Zdefiniuj 1D wymiarowa ścieżkę (krzywą) po której 2D wymiarowy kształt ma się przemieszczać
3. Określ jak ma się skręcać (obracać) 2D wymiarowy kształt
Obiekt extrusion – parametry (ważniejsze)
ex = extrusion(pos=..., shape=...)
pos[] tablica określająca ścieżkę (1D krzywa).
x[], y[], z[] współrzędne pos (domyślnie [0,0,0,0,...])
color[] kolor punktów
red[], green[], blue[] współrzędne color
up kontrola orientacji w chwili początkowej (domyślnie (0,1,0))
visible czy widoczny (domyślnie True)
material materiał pokrywający 2D obiekt z biblioteki materials
(C:\Python27\Lib\site-packages\vis\materials.py) – zależy od karty graficznej, często nie działa
shape zbiór konturów opisujacych kształt 2D
scale tablica xy scalujących czynników w osiach OX i OY (domyślnie [(1,1,), (1,1), ...])
xscale , yscale wektor 1 i 2 współrzędnych scale (domyslnie każdy [1, 1, ...])
twist tablica obrotów (w radianach) względem poprzedniego punktu
(domyślnie [0, 0, 0, ...]) Pierwszy twist[0] jest ignorowany. Wartość dodatnia –
zgodnie z ruchem wskazówek zegara, ujemna – odwrotnie
Obiekt faces
f = faces(pos=…, color=..., normal=…, )
Służy do stworzenia własnego 3D wymiarowego obiektu. Tworzy się taki obiekt z małych trójkątów pokrywających ten kształt
pos[] tablica określająca współrzędne trójkątów (np.:
v1=array([[0.,0.,0.1],[0.,0.1,0.],[0.1,0.,0.]]) v2=array([[1,1,1], [1,1,1], [1,1,1]])
v3=vector([-1,0-1,-1]) f=frame()
model=faces(pos=v1, color=v2, normal=v3, frame=f) model.smooth_shade(doublesided=0)
Inne metody:
.make_twosided()
.smooth(0.8)
.make_normals()
Obiekt frame
Służy do grupowania innych obiektów, np.:
f = frame()
cylinder(frame=f, pos=(0,0,0), radius=0.1, length=1, color=color.cyan)
sphere(frame=f, pos=(1,0,0), radius=0.2, color=color.red) f.axis = (0,1,0) # zmiana orientacji obu obiektów
f.pos = (-1,0,0) # zmiana pozycji obu obiektów
Uwaga! Kula sphere ma współrzędne środka (1,0,0) względem ramki.
Współrzedne możemy przeliczać dwoma funkcjami:
world_pos = f.frame_to_world(frame_pos) frame_pos = f.world_to_frame(world_pos)
Obiekty w ramce przechodzimy np.:
for obj in f.objects:
obj.color = color.red
Obiekt helix
rod = helix(pos=(0,2,1), axis=(5,0,0), radius=0.5) Sprężyna. Ma parametry (w nawiasie domyślne):
pos (0,0,0), x (0), y(0), z(0), axis (1,0,0),
length (1), radius (1), coils (5), thickness (radius/20), color (1,1,1)=color.white, red (1), green (1), blue (1), material,
up (0,1,0 )
Obiekt label
rod = label(pos=ball.pos, height=16, text=‘Etykieta nr %d’ % (12), xoffset=20, yoffset=12, space=ball.radius, border=6, font=„sans”) Parametry (w nawiasie domyślne):
pos; x,y,z – współrzędne etykietowanego punktu (0,0,0)
xoffset, yoffset – wsp. linii do etykiety
text - Tekst do wyświetlenia (może być z „\n” i znakami formatującymi)
font – Nazwa fontu np., 'sans', 'serif', 'monospace’
height - szerokość fontu w pikselach (13)
color, red, green, blue – kolor tekstu (scene.foreground)
background - kolor tła etykiety (scene.background)
opacity – przezroczystość etykiety (0.66, 0- widoczny, 1-przezroczysty)
border – ramka w pikselach wokół etykiety
box - True jeśli ranka wokół etykiety ma być narysowana
line - True jeśli linia do etykiety ma być narysowana
linecolor – kolor linii and ramki
space – promień w pikselach wokół pos gdzie linia ma
nie być rysowana
Obiekt text
rod=text(text='My text is\ngreen‘, align='center', depth=-0.3,
color=color.green)
Do wyświetlania na przykład 3D tekstu np. w obrebie etykiety. Parametry:
pos; x,y,z
align = 'left' (domyślne), 'right', 'center'.
text – tekst do wyświetlania font – Nazwa fontu 'sans', 'serif'
(domyślny), 'monospace‘ lub np.
"Times“ lub "Verdana". '.
height – wysokość liter w pikselach depth – grubość tekstu (efekt 3D)
(domyslne 0.2)
width - szerokośc wyświetlanego tekstu (jak wektor to linii tekstu)
axis – oś wyznaczająca podstawe tekstu ((1,0,0)).
descent – wysokość o ile mniejsze są małe litery od dużych (0.3 x wys.
dużych)
vertical_spacing – pionowy odstęp między liniami
color, red, green, blue – kolor material – materiał jak np.
materials.wood.
upper_left, upper_right, lower_right, lower_left – ramka ograniczająca tekst start - Początek tekstu w linii (jak wektor
to dla każdej linii tekstu).
up – zachowanie tekstu w ramce spacing – odstęp pomiędzy literami
(0.03)
twosided – True gdy można ten obiekt
obracać
Kontrolowanie okien
okno = display(title=‘Przyklad‘, x=0, y=0, width=600, height=200, center=(5,0,0), background=(0,1,1))
Polecenie display() tworzy i wyświetla okno o zadanych parametrach. Na początku zawsze jest tworzone jedno domyślne okno o nazwie scene (można zmieniać jego parametry)
select() – wybór okna (display.get_selected() – wybrane okno)
foreground, background – kolor obiektów ((1,0,0)) i tła (czarny)
stereo – opcje do oglądania stereoskopowego (np. ‘redcyan’, ‘crosseyed’,
‘passive’, ‘active’)
ambient – bezkierunkowe oświetlenie okna (0.2)
lights - wektor świecenia od (0,0,0) do wsp. światła.
cursor.visible – widoczność kursowa (True, False)
objects – atrybut zwracający listę obiektów w oknie Parametry kontroli okna:
x,y – miejsce okna na ekranie w pikselach
title – tytuł okna
visible - czy widoczne w danej chwili
fullscreen - True jeśli zajmuje czały monitor