Autorské riešenie
Semafor sme si položili do karteziánskej sústavy, teda do sústavy X a Y súradníc. Kresliť začíname v bode [0,0]. Zo zadania poznáme:
Z obrázku vieme vyčítať súradnice bodov, v ktorých začneme kresliť svetlá semafora. Pre svtlá semafora teda platí:
Teraz už vieme všetky podstatné súradnice, môžeme teda nakresliť semafor a aj jeho svetlá. Stačí ak sa korytnačka bude pohybovať po zadaných súradniciach. Vytvoríme si najskôr procedúru NakresliSemafor (), ktorá vykreslí obrys semafora pomocou týchto súradníc: [0,0], [0,výškaSemafora], [šírkaSemafora,výškaSemafora], [šírkaSemafora,0]. Na kreslenie jednotlivých svetiel semafora sme si v autorskom riešení vytvorili procedúru NakresliSvetlo (farba, xSur, ySur, priemerSvetla), ktorá má na vstupe parametre xovej a ypsilónovej súradnice, farbu a priemer kresleného svetla. Svetlá najskôr vykreslíme čiernou farbou, ktorá značí vypnutý semafor. Až potom postupne vykreslujeme farebné svetla podľa poradia.Pri vypínaní svetla ho zasa zafarbíme čiernou farbou. Sveltá na semaforoch svietia v nasledujúcom poradí:
Video zaznamenáva správne striedanie svetiel semafora. Striedanie svetiel semafora nám zabezpečuje procedúra striedajFarby(), ktorá jednotlivé svetlá semafora prekresľuje v nekonečnom cykle. Našou hlavnou procedúrou je však procedúra semafor(sirkaSemafora), ktorá v stanovenom poradí volá ostatné, už spomenuté procedúry. Autorské riešenie v jazyku Imagine logo ;Imagine logo
viem nakresliSemafor :sirkaSemafora :vyskaSemafora ; procedúra, ktorá vykreslí obrys semafora nechFP "cierna skry nechXYSur 0 0 nechXYSur 0 :vyskaSemafora nechXYSur :sirkaSemafora :vyskaSemafora) nechXYSur :sirkaSemafora 0 nechXYSur 0 0 koniec viem nakresliSvetlo :Xsuradnica :Ysuradnica :priemerSvetla :farba ;procedúra, ktorá nakreslí svetlo semafora na zadaných súradniciach, so zvolenou farbou a priemerom ph nechXYSur :Xsuradnica :Ysuradnica pd nechFP :farba bod :priemerSvetla koniec viem striedajFarby ;procedúra, ktorá umožňuje striedanie svetiel semafora stále [ nakresliSvetlo :surX :surYCervena :priemer "cervena nakresliSvetlo :surX :surYZelena :priemer 0 nakresliSvetlo :surX :surYOranzova :priemer 0 cakaj 2000 nakresliSvetlo :surX :surYOranzova :priemer "oranzova cakaj 1000 nakresliSvetlo :surX :surYZelena :priemer "zelena nakresliSvetlo :surX :surYOranzova :priemer 0 nakresliSvetlo :surX :surYCervena :priemer 0 cakaj 2000 nakresliSvetlo :surX :surYZelena :priemer 0 nakresliSvetlo :surX :surYOranzova :priemer "oranzova nakresliSvetlo :surX :surYCervena :priemer 0 cakaj 1000 ] koniec viem semafor :sirkaSemafora ;hlavná procedúra, ktorá nám vykreslí funkčný semafor urobTu "vyskaSemafora 3*:sirkaSemafora urobTu "priemer :sirkaSemafora/2 urobTu "surX :sirkaSemafora/2 urobTu "surYZelena 1*:vyskaSemafora/6 urobTu "surYOranzova 3*:vyskaSemafora/6 urobTu "surYCervena 5*:vyskaSemafora/6 nakresliSemafor :sirkaSemafora :vyskaSemafora nakresliSvetlo :surX :surYZelena :priemer "cierna nakresliSvetlo :surX :surYOranzova :priemer "cierna nakresliSvetlo :surX :surYCervena :priemer "cierna striedajFarby koniec
Autorské riešenie v jazyku Python #python
import turtle import time korytnacka = turtle.Turtle() korytnacka.speed(0) korytnacka.hideturtle() korytnacka.penup() plocha = turtle.Screen() def semafor(sirkaSemafora): """ hlavná procedúra :type: :param sirkaSemafora: :rtype : object :return: """ def nakresliSemafor(): """ procedúra, ktorá nakreslí obrys semafora :type: :param: :rtype : object :return: """ korytnacka.pendown() korytnacka.setpos(0, vyskaSemafora) korytnacka.setpos(sirkaSemafora, vyskaSemafora) korytnacka.setpos(sirkaSemafora, 0) korytnacka.setpos(0, 0) korytnacka.penup() nakresliSvetlo("black", surX, surYCervena, priemerSvetla) nakresliSvetlo("black", surX, surYOranzova, priemerSvetla) nakresliSvetlo("black", surX, surYZelena, priemerSvetla) def nakresliSvetlo(farba, xSur, ySur, priemerSvetla): ''' procedúra, ktorá nakreslí na zadaných súradniciach svetlo zvolenej farby a priemeru :type: :param farba: :param xSur: :param ySur: :param priemerSvetla: :rtype : object :return: ''' korytnacka.setpos(xSur, ySur) korytnacka.color(farba) korytnacka.dot(priemerSvetla) def striedajFarby(): """ procedúra, ktorá umožňuje striedanie farebných svetiel semafora :type: :param: :rtype : object :return: """ while True: nakresliSvetlo("red", surX, surYCervena, priemerSvetla) nakresliSvetlo("black", surX, surYOranzova, priemerSvetla) time.sleep(2) nakresliSvetlo("orange", surX, surYOranzova, priemerSvetla) time.sleep(0.5) nakresliSvetlo("black", surX, surYCervena, priemerSvetla) nakresliSvetlo("black", surX, surYOranzova, priemerSvetla) nakresliSvetlo("green", surX, surYZelena, priemerSvetla) time.sleep(2) nakresliSvetlo("orange", surX, surYOranzova, priemerSvetla) nakresliSvetlo("black", surX, surYZelena, priemerSvetla) time.sleep(0.5) korytnacka.setpos(0, 0) vyskaSemafora = 3 * sirkaSemafora priemerSvetla = sirkaSemafora / 2 surX = sirkaSemafora / 2 surYZelena = 1 * vyskaSemafora / 6 surYOranzova = 3 * vyskaSemafora / 6 surYCervena = 5 * vyskaSemafora / 6 nakresliSemafor() striedajFarby() semafor(70) Vaše zaujímavé riešenia a najčastejšie chyby Vaše najčastejšie chyby spočívali v zle prečítanom zadaní úlohy:
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |