Feel Physics:わかりやすい物理学習アプリ

ICT活用、EdTech、STEM 元教員がHoloLensやスマホを使った、わかりやすい物理学習アプリを作っています

速度ベクトルをストロボ表示できるようにしました 一歩一歩進んでおります

f:id:weed_7777:20160628172359p:plain

「ストロボモード」というものを今はつくっています。現在、位置と速度のストロボモードを実装しました。こんな感じです:

コードは抜粋ですがこんな感じです:

def getVelocityVector(passedPoints, population=1, numFramesDelay=0):
    # populationは母集団。すなわち、何フレーム分の位置データを用いて速度を求めるか。
    # populationが3の場合はvはPt[-1],Pt[-4]を参照する。

    indexPtBegin = -1-numFramesDelay-int(population/2)  # ptBegin: 始点
    indexPtEnd   = -1-numFramesDelay+int(population/2)  # ptEnd  : 終点

    # 追跡開始直後
    if len(passedPoints) < population+numFramesDelay - int(population/2)+1 \
            or passedPoints[indexPtBegin] is None \
            or passedPoints[indexPtEnd]   is None:
        return None
    else:
        ptBeginNp = numpy.array(passedPoints[indexPtBegin])
        ptEndNp   = numpy.array(passedPoints[indexPtEnd]  )
        # 移動ベクトル Δpt = ptEnd - ptBegin
        deltaPtNp = ptEndNp - ptBeginNp

        # 移動してなければNoneを返す
        notMoved = (deltaPtNp == numpy.array([0,0]))
        if notMoved.all():
            return None
        # 移動していれば、速度ベクトル = 移動ベクトル / 母数
        else:
            velocityVectorNp = deltaPtNp / float(population)
            velocityVector   = tuple(velocityVectorNp)
            return velocityVector
# 速度ベクトルを記録する
lastVelocityVector = utils.getVelocityVector(
    self._passedPoints, self._populationVelocity,
    self._numFramesDelay
)
self._velocityVectorsHistory.append(lastVelocityVector)

# 速度ベクトルをストロボモードで表示する
if self._shouldDrawVelocityVectorsInStrobeMode:
    for i in range(numPointsVisible - 1):
        if i % self._numStrobeModeSkips == 0 and \
                self._velocityVectorsHistory[i] is not None:
            utils.cvArrow(
                frameToDisplay,
                self._passedPoints[i - self._numFramesDelay],
                self._velocityVectorsHistory[i],
                4, (255,0,0), 5
            )

次は加速度ですね。頑張ります。