Употреба тригонометријских функција¶
Клупко¶
Напиши програм који исцртава клупко, тако што исцрта n=500 насумично одабраних тетива једног круга.
У овом задатку ћемо употребити тригонометријске функције sin и cos да бисмо одредили координате тачке на кругу, за познати угао.
import random, math
import pygame as pg
import pygamebg
(sirina, visina) = (400, 400) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Клупко")
# funkcija nasumično bira tačku sa kruga ciji je centar u (cx, cy),
# a poluprečnik je r
def nasumicnaTackaNaKrugu(cx, cy, r):
# nasumično biramo ugao u radijanima (između 0 i 2*pi)
ugao = 2 * math.pi * random.random()
# izračunavamo koordinate tačke na osnovu ugla
(x, y) = (cx + r * math.cos(ugao), cy + r * math.sin(ugao))
return (x, y)
# bojimo pozadinu prozora u belo
prozor.fill(???)
# centar kruga je centar ekrana
(cx, cy) = (sirina / 2, ???)
# poluprečnik kruga (prečnik je 90% sirine ekrana)
r = ??? * (sirina / 2)
brojDuzi = 500
for i in range(brojDuzi):
# temena duzi su dve nasumično odabrane tačke na krugu
(x1, y1) = nasumicnaTackaNaKrugu(cx, cy, r)
(x2, y2) = nasumicnaTackaNaKrugu(cx, cy, r)
# crtamo duz crnom bojom
pg.draw.aaline(prozor, pg.Color("black"), ???, ???, 1)
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(klupko)
Параметарске криве¶
Параметарски задане криве су оне код којих се положај сваке тачке (њена x и x координата) може израчунати као функција неког параметра t. На пример, кружница је параметарска крива јер се њена свака тачка може израчунати као x=cos(t), y=sin(t), за t∈[0,2π). Напиши програм који исцртава криву која је параметарски задата једначинама x=16⋅sin3(t), y=13⋅cos(t)−5⋅cos(2t)−2⋅cos(3t)−cos(4t). Како изгледа добијена крива?
Дефинисаћемо помоћну функцију f
која на основу вредности параметра
t
израчунава пар координата (x, y)
. Њена имплементација
захтева само да унесемо изразе задате у тексту задатка.
Дефинисаћемо и помоћну функцију која за дати интервал [a, b]
, број
тачака његове поделе n
и редни број i
(између 0 и n
)
одређује i-ту тачку те поделе. Пошто n
тачака дели интервал на
n-1
једнаких делова, ту тачку можемо одредити тако што ширину
интервала b-a
поделимо са n-1
и на леви крај a
додамо
i
тако добијених ширина.
Дефинисаћемо и помоћну функцију која врши прерачунавање координата из класичног математичког координатног система у ком су дефинисане параметарске једначине (он се некада назива координатни систем света) у координатни систем екрана. Координатни почетак система света ћемо ставити у координатни систем екрана, јединичне дужи ћемо скалирати тако да свака заузима k пиксела и променићемо смер раста x координата.
График ћемо нацртати у облику изломљене линије која се састоји од пуно кратких дужи. За сваке две суседне тачке поделе параметарског интервала одредићемо координате одговарајући тачака криве и између њих нацртати дуж. Зато ћемо током рада главне петље памтити координате претходне и текуће тачке криве.
import math
import pygame as pg
import pygamebg
(sirina, visina) = (300, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Срце")
# parametarske jednačine
def f(t):
return (16*math.sin(t)**3,
13*math.cos(t)-5*math.cos(2*t)-2*math.cos(3*t)-math.cos(4*t))
# prevodi koordinate date tačke iz koordinatnog sistema sveta u
# ekranski koordinatni sistem
def u_ekranske(tacka):
k = 7 # koeficijent skaliranja
??? # ekstrahujemo x i y iz uređenog para
return (sirina / 2 + k*x, visina / 2 - k*y)
# izracunava i-tu tacku u podeli intervala [a, b] na n jednako
# razmaknutih tačaka
def podela_intervala(a, b, i, n):
return ???
# bojimo pozadinu u belo
prozor.fill(pg.Color("white"))
# broj tačaka podele
n = 100
# parametarski interval
(a, b) = ???
# prethodna tačka
prethodna = f(a)
for i in range(1, n+1):
# tekuca tačka
tekuca = f(podela_intervala(a, b, i, n))
# crtamo duž između prethodne i tekuće tačke
???
# prelazimo na narednu duž
prethodna = tekuca
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(параметарска_крива)
Пронађи на интернету још параметарских једначина које дају интересантне графике и измени програм тако да се они нацртају.