7.1. Симетрично пресликане координате¶
У досадашњим цртежима координате смо углавном очитавали помоћу миша или су унапред биле задате у тексту задатка. У овом поглављу ћемо видети како неке координате можемо израчунати на основу познавања неких других координата.
Биће нам веома важан међусобни однос положаја и величина објеката у прозору. Kao што знаш, увећавањем \(x\) координате објекти се померају надесно, умањивањем \(x\) координате на лево, умањивањем y координате померају се нагоре, а увећавањем \(y\) координате, померају се надоле.
Симетрични кругови¶
Често ће цртежи које цртамо бити симетрични у односу на неку хоризонталну или вертикалну праву. На пример, ако је прозор ширине 300 пиксела, тада је његова усправна оса удаљена 150 пиксела од леве ивице. Ако желимо да два круга распоредимо симетрично око те усправне осе прозора (на пример, желимо да то буду два ока) и ако први круг има центар у тачки \((110, 80)\), тада други круг треба да има центар у тачки \((190, 80)\).
Наиме, (хоризонтално) растојање од центра левог круга до усправне осе треба да буде исто као растојање од те усправне осе до центра десног круга. Пошто је лево растојање једнако 150 - 110 = 40, десно растојање ће такође бити 40, па је x координата центра десног круга 150 + 40 = 190. Тачке су на истој висини, па им је \(y\) координата једнака. Веома слично се одређују координате и када је оса симетрије било која друга хоризонтална или вертикална права.
Симетрични правоугаоници и елипсе¶
Поступак одређивања параметара правоугаоника и елипсе која је симетрично пресликана мало се разликује од оног за круг или за дуж. Треба водити рачуна о томе да је горње лево теме правоугаоника описаног око тражене елипсе у ствари слика горњег десног темена правоугаоника описаног око познате елипсе.
Нека је на слици доле плава елипса позната, а црвена тражена. Погледајте следећи програм и обратите пажњу на тачке \(M_1\) и \(M_2\). Такође, обратите пажњу и на горња лева темена ових правоугаоника. Да бисмо црвени правоугаоник нацртали као симетричну слику плавог, морамо пронаћи координате горњег левог темена црвеног правоугаоника. Да бисмо то урадили, морамо прво да на основу координата тачке \(M_1\) пронађемо координате тачке \(M_2\), која је подједнако удаљена од усправне осе прозора као и тачка \(M_1\). Након тога, биће довољно да одузмемо ширину правоугаоника од \(х\) координате тачке \(M_2\) и добићемо \(х\) координату горњег левог темена црвеног правоугаоника.
Мачка¶
Напиши програм који црта главу мачке. Глава мачке је потпуно симетрична у односу на средину прозора и то се може искористити!
Највећи део посла овде већ је урађен (како бисмо ти помогли). Твој посао је да додаш пет наредби за цртање на предвиђена места. Објашњење које следи односи се на цртање комплетног цртежа и служи да би ти помогло да схватиш симетрије, као и да урадиш свој делић посла.
Уши ове мачке могу да се прикажу као попуњени троуглови. Како се уши надовезују на главу, по два темена сваког троугла могу да буду изабрана са више слободе (довољно је да буду негде у глави). Осим два троугла који представљају уши, имамо још:
два круга (глава и врх њушке),
шест елипси (очи, зенице и делови њушке),
шест линија (бркови).
Приликом цртања користе се боје gray
, darkgray
, black
,
yellow
и green
.
Да видиш слику коју треба да нацрташ, притисни дугме „Прикажи пример“. Ту можеш да очитаваш само координате на левој половини слике, а она је већ нацртана у програму помоћу функција за цртање. Исте функције ћеш користити и за десну половину слике, само са другим координатама. X-координате тачака на десној половини слике се не могу очитавати, израчунај их користећи симетрију!
Дат је комплетан програм, можете да га испробате и овде.
Центрирани правоугаоници и елипсе¶
Иако се цртање правоугаоника или елипсе врши тако што се задају координате горњег левог темена, често имамо потребу да нацртамо правоугаоник или елипсу којима су познате координате средишта и димензије. Размисли о томе како се то може урадити, па кроз наредна питања провери да ли си у праву.
- pg.draw.rect(prozor, boja, (100, 100, 80, 40))
- Покушај поново
- pg.draw.rect(prozor, boja, (100, 100, 160, 80))
- Покушај поново
- pg.draw.rect(prozor, boja, (60, 80, 80, 40))
- Тачно
- pg.draw.rect(prozor, boja, (20, 60, 160, 80))
- Покушај поново
Q-48: Желиш да нацрташ правоугаоник ширине 80 и висине 40 тако да му је центар у тачки 100 и 100. Коју наредбу можеш да употребиш за то?
- pg.draw.ellipse(prozor, boja, (80, 100, 60, 40))
- Покушај поново
- pg.draw.ellipse(prozor, boja, (80, 100), (60, 40))
- Покушај поново
- pg.draw.ellipse(prozor, boja, (20, 60, 120, 80))
- Тачно
- pg.draw.ellipse(prozor, boja, (80, 100), (120, 80))
- Покушај поново
Q-49: Да би се нацртала елипса са центром у тачки (80, 100), чије су полуосе 60 и 40 пиксела, потребно је извршити позив функције:
Прилагоди сада наредни програм тако што ћеш направити жути правоугаоник и плаву елипсу димензија 100 пута 80 пиксела чији је центар у центру прозора, тј. тачки (150, 150).
Сличан, али мало компликованији задатак је да се нацрта правоугаоник познатих димензија, који је центриран унутар другог датог правоугаоника. Прво можеш да израчунаш средиште задатог, описаног правоугаоника, а затим да израчунаш координате горњег левог темена уписаног правоугаоника тако што од средишта одузмеш половину ширине и половину висине уписаног правоугаоника.
Специјалан случају када је спољни правоугаоник цео прозор
У специјалном случају када је спољни правоугаоник цео прозор, правоугаоник можемо центрирати тако што му \(x\) координату горњег левог темена поставимо на половину разлике између ширине прозора и ширине правоугаоника, а \(y\) координату поставимо на половину разлике између ширине између висине прозора и висине правоугаоника. На тај начин слободан простор око правоугаоника равномерно распоређујемо на леву и десну, односно на горњу и доњу маргину.
Провери да ли ово разумеш, тако што ћеш одговорити на следеће питање.
- pg.draw.rect(prozor, pg.Color("blue"), (20, 0, 40, 30))
- Покушај поново
- pg.draw.rect(prozor, pg.Color("blue"), (130, 170, 40, 30))
- Покушај поново
- pg.draw.rect(prozor, pg.Color("blue"), (40, 35, 40, 30))
- Покушај поново
- pg.draw.rect(prozor, pg.Color("blue"), (170, 205, 40, 30))
- Тачно
Q-50: Правоугаоник плаве боје, ширине 40 и висине 30 пиксела треба да буде центриран у жутом правоугаонику чија је ширина 120 и висина 100 пиксела и чије је горње лево теме у тачки (130, 170). Како се тај правоугаоник може нацртати?
У наредном програму можеш и да провериш како ово функционише:
Напиши програм који црта црвени квадрат димензије 200 пиксела, зелени димензије 150 пиксела и плави димензије 100 пиксела, а који су центрирани у прозору димензије 300 пута 300 пиксела.
Најважније из ове лекције:¶
Често непознате координате можемо израчунати на основу познатих координата у одређеном програму.
Када пресликавамо неки облик по некој оси, важно је да обратимо пажњу на кључне тачке за цртање тог облика и да пронађемо у које ће се тачке оне пресликати.