Autorské riešenie
Pre výpočet ťažiska celého lustra potrebujeme vypočítať ťažisko mriežky aj ťažisko podložky. Mriežka pozostáva z náhodne vybraných úsečkových segmentov umiestnených v štvorcovej mriežke 10x10 malých štvorčekov. Ťažisko každého z 300 úsečkových segmentov vypočítame pomocou funkcie vypocet_taziska(): # Python def vypocet_taziska(x1, y1, x2, y2, m1=1, m2=1): ''' výpočet ťažiska dvoch telies so zadanými hmotnosťami a súradnicami, resp. úsečky so zadanými súradnicami krajných bodov ''' xt = (x1 * m1 + x2 * m2) / (m1 + m2) yt = (y1 * m1 + y2 * m2) / (m1 + m2) return xt, yt Pri výpočte ťažiska mriežky môžeme postupovať dvomi spôsobmi:
Vyberieme si druhý spôsob a výpočet urobíme v rámci funkcie tlac_vzor(), kde do tela vnorených cyklov do jednotlivých podmienok za vykresľovanie úsečkového segmentu so súradnicami (x + 10, y + 10, x + a, y + b) doplníme výpočet ťažiska segmentu (x + 10, y + 10, x + a, y + b). X-ové a y-ové súradnice ťažísk segmentov postupne sčítame a po vnorených cykloch vypočítame ťažisko celej mriežky ako podiel súčtu x-ových resp. súčtu y-ových s počtom segmentov, čo vynesieme ako výsledok tejto funkcie. Ťažisko štvrcovej podložky s rozmermi 200x200 bodov s počiatkom (0,0) bude v jej strede t.j. v bode (100, 100). Napokon ťažisko celého lustra vypočítame ako ťažisko dvoch telies - mriežky s 300 segmentmi a podložky pomocou funkcie vypocet_taziska(). Výsledné riešenie môže vyzerať nasledovne: # Python import random import turtle def useckovy_segment(x1, y1, x2, y2): ''' vykreslenie úsečky zadanej súradnicami jej krajných bodov ''' pero.penup() pero.setposition(x1, y1) pero.pendown() pero.setposition(x2, y2) def mriezka(): ''' vykreslenie sivej štvorcovej mriežky s 10x10 štvorčekovými políčkami ''' pero.pensize(1) pero.pencolor('lightgray') for i in range(0, 201, 20): useckovy_segment(0, i, 200, i) useckovy_segment(i, 0, i, 200) def vypocet_taziska(x1, y1, x2, y2, m1=1, m2=1): ''' výpočet ťažiska dvoch telies so zadanými hmotnosťami a súradnicami, resp. úsečky so zadanými súradnicami krajných bodov ''' xt = (x1 * m1 + x2 * m2) / (m1 + m2) yt = (y1 * m1 + y2 * m2) / (m1 + m2) return xt, yt def tlac_vzor(): ''' vykreslenie náhodného vzoru so zelenými úsečkovými segmentmi a výpočet ťažiska všetkých úsečkových segmentov ''' pero.pensize(2) pero.pencolor('green') pocet = 0 sucet_x = 0 sucet_y = 0 for x in range(0, 200, 20): for y in range(0, 200, 20): nahoda = random.randint(1, 4) if nahoda != 1: useckovy_segment(x + 10, y + 10, x, y) pocet += 1 sucet_x += vypocet_taziska(x + 10, y + 10, x, y)[0] sucet_y += vypocet_taziska(x + 10, y + 10, x, y)[1] if nahoda != 2: useckovy_segment(x + 10, y + 10, x, y + 20) pocet += 1 sucet_x += vypocet_taziska(x + 10, y + 10, x, y + 20)[0] sucet_y += vypocet_taziska(x + 10, y + 10, x, y + 20)[1] if nahoda != 3: useckovy_segment(x + 10, y + 10, x + 20, y) pocet += 1 sucet_x += vypocet_taziska(x + 10, y + 10, x + 20, y)[0] sucet_y += vypocet_taziska(x + 10, y + 10, x + 20, y)[1] if nahoda != 4: useckovy_segment(x + 10, y + 10, x + 20, y + 20) pocet += 1 sucet_x += vypocet_taziska(x + 10, y + 10, x + 20, y + 20)[0] sucet_y += vypocet_taziska(x + 10, y + 10, x + 20, y + 20)[1] return sucet_x, sucet_y, pocet def tazisko_lustra(): ''' výpočet ťažiska celého lustra tvoreného mriežkou s úsečkovými segmentmi a podložkou ''' x1t, y1t = tlac_vzor() # ťažisko mriežky x2t, y2t = 100, 100 # ťažisko podložky xt, yt = vypocet_taziska(x1t, y1t, x2t, y2t) return xt, yt pero = turtle.Turtle() plocha = turtle.Screen() plocha.delay(0) pero.speed(0) pero.hideturtle() mriezka() print(tazisko_lustra()) plocha.mainloop() Táto úloha je zameraná na:
Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy sa zapojilo 31 tímov z kategórie GURU. Plný počet bodov dosiahli tímy acubed, file-open, ojoj a sigma, ktorým gratulujeme. V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:
|
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |