.. title:: Pythonã§å¿ƒç†å®Ÿé¨“ - 例題8-2 例題8-2:直接テクスãƒãƒ£ã‚’æãã“ã‚€ ==================================== **A:** ã•ã¦ã€æ—©é€Ÿãƒ—ãƒã‚°ãƒ©ãƒ 内ã§ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’æã方法を解説ã—よã†ã€‚ **B:** 今回ã¯ç„¡é§„ãªå‰ãƒ•リãªã—ã§ã™ã‹ã€‚ **A:** ã•ã¦ã€ã•ã£ããã ãŒä»Šå›žã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ を見ã¦ã‚‚らãŠã†ã‹ã€‚ **B:** ã¸ï¼Ÿ ã‚‚ã†ã‚µãƒ³ãƒ—ルãŒã‚ã‚‹ã‚“ã§ã™ã‹ï¼Ÿ **A:** ç§ãŒVisionEggã®ãƒ—ãƒã‚°ãƒ©ãƒ を勉強ã—å§‹ã‚ãŸã“ã‚ã«ä½œã£ãŸãƒ—ãƒã‚°ãƒ©ãƒ を引ã£å¼µã‚Šå‡ºã—ã¦ããŸã®ã•。 **B:** ãšã„ã¶ã‚“手回ã—ãŒã„ã„ã¨æ€ã£ãŸã‚‰â€¦ã€‚ **A:** ãã‚“ãªã‚ã‘ã§ã€VisionEggã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã‚’å‚考ã«ä½œã£ãŸã‚‚ã®ã ã‹ã‚‰ã€ä¾‹é¡Œ7ã§è§£èª¬ã—ãŸVisionEgg.FlowControlを使ã£ã¦ã„る。 例題7ã‚’èªã‚“ã§ã„ãªã„人ã¯å…ˆã«èªã‚“ã§ãŠã„ã¦ãã ã•ã„。 **B:** ã¾ãŸãã‚“ãªæ‰‹æŠœãを…。書ãç›´ã›ã°ã„ã„ã®ã«ã€‚ **A:** ん? ãã“ã®å›ã€ä½•ã‹ï¼Ÿ **B:** ã„ã‚„ã€ãªã‚“ã§ã‚‚ãªã„ã§ã™ã€‚ + 行番å·ãªã—ã®ã‚½ãƒ¼ã‚¹ãƒ•ァイルをダウンãƒãƒ¼ãƒ‰â†’ `08-2.py <source/08-2.py>`_ .. literalinclude:: source/08-2.py :language: python :encoding: shift-jis :linenos: :lineno-match: **A:** ã¾ãšæœ€åˆã®ãƒã‚¤ãƒ³ãƒˆã¯9行目。Imageã¨ImageDrawã¨ã„ã†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’importã—ã¦ã„る。 ã“れã¯PILã€Python Imaging Libraryã¨å‘¼ã°ã‚Œã‚‹ãƒ‘ッケージã®ä¸€éƒ¨ã 。PILã¯pythonã§ã•ã¾ã–ã¾ãªç”»åƒå‡¦ç†ã‚’行ã†å¼·åŠ›ãªãƒ©ã‚¤ãƒ–ラリã§ã€æœ¬å½“ã«ã„ã‚ã‚“ãªæ©Ÿèƒ½ãŒã‚る。 VisionEggをインストールã™ã‚‹ã¨ãã«PILã¯å¿…é ˆãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã¨ã—ã¦æŒ‡å®šã•れã¦ã„ã‚‹ã®ã§ã€VisionEggをインストール済ã¿ãªã‚‰ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã¯ãšã€‚ **B:** ãµã‚€ãµã‚€ã€‚ **A:** 実際ã«ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’作るã®ã¯31ã‹ã‚‰35行目ã 。ã¾ãš31行目ã§ä½œæˆã—ãŸã„テクスãƒãƒ£ã®ã‚µã‚¤ã‚ºã‚’(横幅,縦幅)ã®ã‚¿ãƒ—ãƒ«ã§æŒ‡å®šã€‚ ç¶šã„ã¦32行目ã®Image.new()ã§ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’作æˆã™ã‚‹ã€‚第1引数ã®"RGBA"ã¯RGBã¨Î±ãƒãƒ£ãƒ³ãƒãƒ«ãŒã‚ã‚‹ç”»åƒã§ã™ã‚ˆã€ã¨ã„ã†æŒ‡å®šã€‚普通ã®RGBやグレースケールãªã©ã„ã‚ã„ã‚æŒ‡å®šã§ãる。 ç¶šã„ã¦ç¬¬2引数ã ãŒã€ã“れã¯ä½œæˆã•れãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’塗りã¤ã¶ã™è‰²ã 。VisionEggã¨ç•°ãªã‚Šã€0ã‹ã‚‰255ã®å€¤ã§æŒ‡å®šã™ã‚‹ã€‚今回ã®ã‚ˆã†ã«Î±ãƒãƒ£ãƒ³ãƒãƒ«ã‚’指定ã™ã‚‹å ´åˆã¯ã€Rã€Gã€Bã€Aã®4ã¤ã®å€¤ã‚’ã“ã®é †ç•ªã«æŒ‡å®šã™ã‚‹ã€‚Aã£ã¦ã®ã¯Î±ã。 **B:** ãˆãˆã¨ã€Rã€Gã€BãŒæœ€å¤§å€¤255ã§224。明るã‚ã®ç°è‰²ï¼Ÿ **A:** ãã®é€šã‚Šã€‚ãã—ã¦æœ€å¾Œã®Aã ãŒã€å€¤ãŒå¤§ãã„ã»ã©ä¸é€æ˜Žã«ãªã‚‹ã€‚最大値255ã«å¯¾ã—ã¦255ã ã‹ã‚‰ã€å®Œå…¨ãªä¸é€æ˜Žã¨ã„ã†ã“ã¨ã€‚ **B:** ãªã‚‹ã»ã©ã€‚ **A:** ç¶šã„ã¦33行目。32行目ã§ä½œæˆã•れãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯im_texelsã¨ã„ã†å¤‰æ•°ã«æ ¼ç´ã•れã¦ã„ã‚‹ã‚ã‘ã ãŒã€ã“ã®im_texelsã«æç”»ã™ã‚‹ãŸã‚ã®ã‚¤ãƒ³ã‚¿ãƒ•ェースをImageDraw()ã¨ã„ã†ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使ã£ã¦ä½œæˆã™ã‚‹ã€‚ **B:** インタフェースを作æˆã™ã‚‹ï¼Ÿï¼Ÿï¼Ÿ **A:** ãµã‚€ã€‚ã“れã¯ã¡ã‚‡ã£ã¨ã‚ã‹ã‚Šã«ãã„ã‹ã‚‚ã—れãªã„ãªã€‚Image.new()ã§ä½œã‚‰ã‚Œã‚‹ã®ã¯Image.Imageã¨ã„ã†ã‚¯ãƒ©ã‚¹ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãªã‚“ã ãŒã€ã“ã®ã‚¯ãƒ©ã‚¹ã«ã¯ ç°¡å˜ãªç”»åƒæ“作ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚ã‚‹ã‚‚ã®ã®ã€è¤‡é›‘ãªå›³å½¢ã‚’æã機能ã¯ãªã„。ãã“ã§ã€å›³å½¢ã‚’æã機能をã¾ã¨ã‚ãŸImageDrawã¨ã„ã†ã‚¯ãƒ©ã‚¹ã‚’通ã˜ã¦å›³å½¢ã‚’æãã‚“ã 。Image.ImageãŒç”»åƒãƒ•ァイルã ã¨ã—ãŸã‚‰ImageDraw㯠画åƒç·¨é›†ã‚½ãƒ•トã ã¨æ€ãˆã°ã„ã„。ImageDraw.Draw()ã¯ç”»åƒç·¨é›†ã‚½ãƒ•トã®ã€Œãƒ•ァイルを開ãã€ã€‚ãã—ã¦é–‹ã„ãŸç”»åƒãƒ•ァイルã«å¯¾ã—ã¦ImageDrawã®æ©Ÿèƒ½ã‚’使ã£ã¦æç”»ã—ã¦ã„ã。 **B:** ã¯ã‚ã€ã‚ã‹ã£ãŸã‚ˆã†ãªã‚ã‹ã‚‰ãªã„よã†ãªã€‚ **A:** ã¾ã‚å…ˆã¸é€²ã‚€ãžã€‚今回ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®çœŸã‚“ä¸ã«ã€Œä¸¸ã„ç©´ã€ã‚’æããŸã„。「丸ã„ç©´ã€ã‚’æããŸã‚ã«ã¯ä½•色ã§å¡—りã¤ã¶ã›ã°ã„ã„ã‹ãªï¼Ÿ **B:** ã¸ï¼Ÿ ç©´ã‚’æããªã‚‰ä½•色ã‹ã£ã¦ï¼Ÿ …黒? **A:** ã“らã“ら。αãƒãƒ£ãƒ³ãƒãƒ«ã よ。Aã®å€¤ãŒä½Žã„ã»ã©é€æ˜Žã«ãªã‚‹ã‚“ã ã‹ã‚‰ã€å®Œå…¨ã«é€æ˜Žã«ã™ã‚‹ã«ã¯Aã®å€¤ãŒ0ã®è‰²ã§å¡—りã¤ã¶ã›ã°ã„ã„。 **B:** RGBã®å€¤ã¯ï¼Ÿ **A:** Aã®å€¤ãŒ0ãªã‚‰å®Œå…¨ãªé€æ˜Žã ã‹ã‚‰ã€0ã‹ã‚‰255ã®æ•´æ•°ã§ã‚れã°ãªã‚“ã§ã‚‚ã„ã„。Aã«0より大ãã„値をè¨å®šã—ãŸå ´åˆã¯åŠé€æ˜Žã«ãªã‚‹ã®ã§ã€ã“ã®å ´åˆã¯RGBã®å€¤ãŒåйã„ã¦ãる。 **B:** ã¯ã¯ã‚。ãªã‚‹ã»ã©ã€‚ **A:** 別ã«Bå›ã®ç”ãˆã«åˆã‚ã›ãŸã‚ã‘ã˜ã‚ƒãªã„ãŒã€ã“ã®ã‚µãƒ³ãƒ—ルã®34行目ã§ã¯é»’ã®é€æ˜Žè‰²ã€ã™ãªã‚ã¡(0,0,0,0)ã§å¡—りã¤ã¶ã—ã¦ã„る。 丸ã塗りã¤ã¶ã™ãƒ¡ã‚½ãƒƒãƒ‰ã¯ImageDraw.ellipse()ã 。åå‰ã®ã¨ãŠã‚Šã“ã‚Œã¯æ¥•円をæã関数ã§ã€ç¬¬1引数ã§ã¯æ¥•円ã«ã´ã£ãŸã‚Šå¤–接ã™ã‚‹é•·æ–¹å½¢ã®å³ä¸Šã¨å·¦ä¸‹ã®åº§æ¨™ã‚’指定ã™ã‚‹ã€‚ (200,100)+(400,300)ã£ã¦ã®ã¯(600,400)ã˜ã‚ƒãªã„ãžã€‚タプルやリストã«å¯¾ã™ã‚‹+演算åã¯çµåˆã ã‹ã‚‰ã€(200,100,400,300)ã¨ã„ã†ã‚¿ãƒ—ルã«ãªã‚‹ã€‚ **B:** ã†ã¯ã€ã¦ã£ãり(600,400)ã‹ã¨æ€ã„ã¾ã—ãŸã€‚ **A:** 例題3-3を復習ã—ã¦ãŠãよã†ã«ã€‚ã“ã®å ´åˆã® **座標ã¯VisionEggã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³åº§æ¨™ã§ã¯ãªãã€ä»Šæç”»ä¸ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£å†…ã®åº§æ¨™** ãªã®ã§æ³¨æ„ã™ã‚‹ã‚ˆã†ã«ã€‚ **B:** ã‚ã®ãƒ¼ã€‚ **A:** ん? ã©ã†ã—ãŸï¼Ÿ **B:** ã‚ã®ãƒ¼ã€‚外接ã£ã¦ãªã‚“ã§ã—ãŸã£ã‘。 **A:** ã‚ーã£ã€ã‚‚ã†ã€‚ã“ã†ã„ã†ã“ã¨ã よ。 .. figure:: img/08-2-01.png **B:** よãã‚ã‹ã‚Šã¾ã—ãŸã€‚ **A:** ã•ã¦ã€ã“れã§ä¸¸ã„ç©´ãŒã‚ã„ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯å®Œæˆã€‚ã‚ã¨ã¯ä¾‹é¡Œ8-1ã¨åŒã˜ã ã。35行目ã§im_texelsを引数ã«VisionEgg.Texture.Textureã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’生æˆã—ã¦ã€36行目ã§VisionEgg.Texture.TextureStimulusã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’生æˆã€‚ αãƒãƒ£ãƒ³ãƒãƒ«ã‚’使ã£ã¦ã„ã‚‹ã®ã§å¿˜ã‚Œãšã«internal_format = OpenGL.GL.GL_RGBAを指定ã—ã¦ãŠãã“ã¨ã€‚ **B:** æ„外ã¨ç°¡å˜ã§ã™ã。 **A:** ã ã‚? ImageDrawã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã¯arcã¨ã‹lineã¨ã‹pointã¨ã‹polygonã¨ã‹rectangleã¨ã‹textã¨ã‹ã„ã‚ã„ã‚ã‚ã‚‹ã‹ã‚‰èª¿ã¹ã¦ã¿ã‚‹ã¨ã„ã„。 **B:** ã¯ãƒ¼ã„。 **A:** ã•ã¦ã€å¾Œã¯44行目ã‹ã‚‰76行目ã ãŒâ€¦ã€‚ã“れã¯å®Ÿéš›ã«ãƒ—ãƒã‚°ãƒ©ãƒ ã®å‹•作を見ã¦ã‹ã‚‰èªã¿ç›´ã—ãŸã‚‰ã‚ã‹ã‚‹ã§ã—ょ。 例題7ã®ç·´ç¿’å•é¡Œï¼ 44行目ã‹ã‚‰76行目ã®å‹•作を自分ã§ç†è§£ã—ãªã•ã„ï¼ **B:** ãˆãƒ¼ã£ã€æ‰‹æŠœãã€æ‰‹æŠœãï¼ **A:** ã†ã‚‹ã•ã„。αãƒãƒ£ãƒ³ãƒãƒ«é–¢é€£ã§ã²ã¨ã¤ã ã‘解説ã—ã¦ãŠã“ã†ã€‚67ã€69ã€74ã€76行目。ã“れã¯ãƒ•レーム毎ã«å‘¼ã³å‡ºã•れる every_frame_func()関数ã®ä¸ã«ã‚ã‚‹ã‚“ã ãŒã€PresentationãŒé–‹å§‹ã•れã¦ã‹ã‚‰ã®æ™‚é–“ã«å¿œã˜ã¦ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®æœ€å¤§é€æ˜Žåº¦ã‚’指定ã™ã‚‹ãƒ‘ラメータmax_alphaを変更ã—ã¦ã„る。 ã“れã«ã‚ˆã£ã¦ã€ãƒ—ãƒã‚°ãƒ©ãƒ ã®å®Ÿè¡Œä¸ã«ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’åŠé€æ˜Žã«ã—ãŸã‚Šä¸é€æ˜Žã«ã—ãŸã‚Šã™ã‚‹ã“ã¨ã‚‚ã§ãる。 **B:** 完全ã«é€æ˜Žã«ã‚‚出æ¥ã‚‹ã‚“ã§ã™ã‹ï¼Ÿ **A:** ãりゃ出æ¥ã‚‹ãŒã€ãã®å ´åˆã¯ã‚ã–ã‚ã–逿˜Žåº¦ã‚’指定ã—ãªãã¦ã‚‚onパラメータをFalseã«ã™ã‚Œã°ã„ã„ã ã‚。 **B:** ã‚ã€ãã†ã‹ã€‚ **A:** ã“ã“ã§æ³¨æ„ã—ã¦ã»ã—ã„ã“ã¨ã¯ã€32行目ã¯34行目ã®PILã§Î±ãƒãƒ£ãƒ³ãƒãƒ«ã‚’指定ã—ãŸã¨ãã«ã¯0ã‹ã‚‰255ã®æ•´æ•°ã§æŒ‡å®šã—ãŸã‘ã©ã€67行目ãªã©ã§max_alphaを指定ã—ã¦ã„ã‚‹ã¨ãã«ã¯0ã‹ã‚‰1ã®å°æ•°ã§æŒ‡å®šã—ã¦ã„ã‚‹ã“ã¨ã€‚ ã“ã®ä¾‹ã«é™ã‚‰ãšVisionEggã§ã¯Î±ãƒãƒ£ãƒ³ãƒãƒ«ã¯RGBã¨åŒæ§˜ã«0ã‹ã‚‰1ã§æŒ‡å®šã™ã‚‹ã€‚ **B:** ã‚„ã‚„ã“ã—ã„ãªã‚。ãªã‚“ã§çµ±ä¸€ã•れã¦ãªã„ã‚“ã§ã—ょ。 **A:** å‰å›žã‚‚言ã£ãŸã‘ã©VisionEggã¯OpenGL上ã«å®Ÿè£…ã•れã¦ã„ã‚‹ã‹ã‚‰ãªã€‚OpenGLã§ã¯RGBAã®æˆåˆ†ã‚’0ã‹ã‚‰1ã®å°æ•°ã§æŒ‡å®šã™ã‚‹ã€‚ **B:** ã†ãƒ¼ã‚“。 **A:** ã¾ã‚ã€é–“é•ãˆã¦ã‚‚エラーメッセージãŒå‡ºã‚‹ã‹è¡¨ç¤ºãŒå¤‰ã«ãªã‚‹ã‹ã‚‰ã™ãã«æ°—付ãよ。ã•ã¦ã€ã“れã§ä»Šå›žã®ã‚µãƒ³ãƒ—ルも説明終了ã‹ãªã€‚å‹•ã‹ã—ã¦ã¿ã‚ˆã†ã€‚ .. figure:: img/08-2-02.png **B:** ãŠãŠã€åŠé€æ˜Žã«ãªã‚‹ã®ãŒé¢ç™½ã„ã§ã™ã。ã“れã€è‡ªåˆ†ã§ã‚ーボードを押ã—ã¦åŠé€æ˜Žã‚’切り替ãˆã‚‰ã‚ŒãŸã‚‰ã‚‚ã£ã¨é¢ç™½ãã†ã€‚ **A:** ã„ã„ã“ã¨è¨€ã†ã。ãれã€ç·´ç¿’å•題ã。 **B:** ã†ã’ã€è—ªè›‡è—ªè›‡ã€‚ **A:** ã¨ã„ã†ã‚ã‘ã§ã€Î±ãƒãƒ£ãƒ³ãƒãƒ«ã®è§£èª¬ã¯ã“ã‚“ãªã‚‚ã‚“ã§å分ã‹ãªã€‚次回ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®æãã‹ãˆã§ã‚‚ã‚„ã£ã¦ã¿ã‚‹ã‹ã€‚ **B:** ã‚ã®ãƒ¼ã€çµ‚ã‚ã‚‹å‰ã«ã²ã¨ã¤è³ªå•ãŒã€‚ **A:** ん? **B:** ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯max_alphaã£ã¦ãƒ‘ラメータã§ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é€æ˜Žåº¦ã‚’変ãˆã¦ã¾ã™ã‘ã©ã€ä»Šã¾ã§å‡ºã¦ããŸVisionEggã®åˆºæ¿€ã‚‚åŒã˜ã‚ˆã†ã«é€æ˜Žåº¦ã‚’変ãˆã‚‰ã‚Œã‚‹ã‚“ã§ã—ょã†ã‹ã€‚ **A:** ãŠã£ã¨ã€å¤§äº‹ãªã“ã¨ãªã®ã«è§£èª¬ã‚’忘れã¦ã„ãŸãªã€‚ã‚りãŒã¨ã†ã€‚VisionEgg.MoreStimuli.Target2Dãªã©ã®VisionEggã®åˆºæ¿€ã§ã¯ã€colorパラメータã§é€æ˜Žåº¦ã‚’指定ã™ã‚Œã°ã„ã„。 書å¼ã¯R,G,B,Aã®é †ã«0ã‹ã‚‰1ã®å°æ•°ã§æŒ‡å®šã™ã‚‹ã€‚完全ãªé€æ˜ŽãŒ0ã€ä¸é€æ˜ŽãŒ1ã 。例ãˆã°(1.0, 0.0, 0.0, 0.1)ã ã¨ã‹ãªã‚Šé€æ˜Žãªèµ¤ã«ãªã‚‹ã€‚今ã¾ã§ã®ä¾‹é¡Œã®ã‚ˆã†ã«RGBã ã‘ã§colorを指定ã—ãŸå ´åˆã¯A=1を指定ã—ãŸã®ã¨åŒã˜çµæžœã«ãªã‚‹ã€‚ プãƒã‚°ãƒ©ãƒ ä¸ã§é€æ˜Žåº¦ã‚’変更ã—ãŸã„å ´åˆã‚‚ã€colorパラメータを変更ã™ã‚Œã°ã„ã„。簡å˜ã«è©¦ã›ã‚‹ã‹ã‚‰ä»Šã¾ã§ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’é©å½“ã«ã„ã˜ã£ã¦è©¦ã—ã¦ã¿ãŸã‚‰ã„ã„。 **B:** ã‚„ã£ã¦ã¿ã¾ã™ã€‚ **A:** ãã‚“ãªã‚ã‘ã§ã€ä»Šå›žã¯ã“れã§çµ‚了。