PSM

python する man

ProcessingでPythonを使ってみる(実践編2)

前回
muromura.hatenablog.com
の続きでいろいろ試してみる

マウスとインタラクティブ

Built with Processingを参考に,マウスを押している間だけ散らばり,マウスを離すと元の位置に戻る四角形の集合体を実装しました.
f:id:muromura:20180405204634g:plain

import Dot
#add_library('gifAnimation')

def setup():
    global speed, wNum, hNum, dots, gifMaker
    size(800, 800)

    wNum = 20
    hNum = 20

    dotSize = 10  # size of dot
    dotMargin = 2  # margin between each dot
    dotUnit = dotSize + dotMargin  # the unit size of dots

    dots = [None for i in range(wNum * hNum)]
    for i in range(hNum):
        for j in range(wNum):
            dots[i * wNum + j] = Dot.Dot(dotSize, dotSize, width / 2 + dotUnit * (
                i - hNum / 2), height / 2 + dotUnit * (j - wNum / 2), 50, i * wNum + j)
    """        
    gifMaker = GifMaker(this, "dots_p.gif")
    gifMaker.setRepeat(0)
    gifMaker.setDelay(10)
    """

def draw():
    background(50)

    pat = mousePressed

    for i in range(hNum * wNum):
        dots[i].display()
        dots[i].move(0.01, pat)  # need speed of dots
    """
    gifMaker.addFrame()
    if (frameCount > 100):
        gifMaker.finish()
        exit()
    """

コメントアウトしてある部分はgif作成用です.

また,Dot classの定義は

class Dot:

    def __init__(self, w, h, x, y, clr, cnt):
        self.rectW = w
        self.rectH = h
        self.xPos = x
        self.yPos = y
        self.iniXPos = x
        self.iniYPos = y
        self.c = clr
        self.dotNum = cnt
        self.pattern = 0
        self.c1 = color(255, 255, 255, 255)
        self.nextX = x
        self.nextY = y

    def display(self):
        fill(self.c1)
        stroke(self.c1)
        rectMode(CENTER)
        rect(self.xPos, self.yPos, self.rectW, self.rectH)

    def move(self, speed, pattern):
        self.speed = speed
        self.pattern = pattern

        if self.pattern == 0:
            self.speed *= 10
            self.nextX = self.iniXPos
            self.nextY = self.iniYPos
        else:
            self.nextX += random(-width / 8, width / 8)
            self.nextY += random(-height / 8, height / 8)

        self.xDiff = (self.xPos - self.nextX) * self.speed
        self.yDiff = (self.yPos - self.nextY) * self.speed

        self.xPos -= self.xDiff
        self.yPos -= self.yDiff

Tips
・クラス定義などは,New Tabで新しいタブを作ってそこに書いておくとコードが見やすい
f:id:muromura:20180405205227p:plain
・上記のNewTabの内容は,python modeではsketchと同じディレクトリ内に.pyファイルとして保存される