Pythonの内容表記に引き続き、

またまたオライリーの行列プログラマーの課題を解く。


ベクトルの章で、

2要素の2点があり、その2点を端点とする線分を書くための関数を作成する課題があった。

制約としては、ベクトルを平面上に連続した点として描写することで、

任意の2点を端点とする線分も同様に連続した点として描写する。


一点目をpt1 = [3.5, 3]とし、


vector1


この様なベクトルになる。


二点目をpt2 = [0.5, 1]で


vector2


この様なベクトルになる。

この二点を端点とするベクトルということは、pt1 - pt2で求めることができ、


vector_add


こうなる。

※どのベクトルも→は右を向いている。


ベクトルの加算や減算は紙で書くと楽だけど、

これをコンピュータに書かせるとなると大変だった。




コンピュータにベクトルの加算や減算を描写させる上で重要になるのが凸結合というものらしい。


凸結合というのは、

v = (v1, v2)とu = (u1, u2)という座標があるとする。

この二つを凸結合させるにあたって、vに 0 ≦ α ≦ 1となるαをu - vにかけた後にvを足す。


α(u1 - v1 , u2 - v2) + (v1, v2) = α{(u1, u2) - (v1, v2)} + (v1, v2)
                                 = α(u1, u2) - α(v1, v2) + (v1, v2)
                                 = α(u1, u2) + (1- α)(v1, v2)

とし、1 - α = βと置き、αu + βvとする。

この時、0 ≦ β ≦ 1が成り立つ。


ここのαを0から1までの実数を指定して、可能な限り点を描写すれば加算したベクトルを描写することができ、

今回の課題はこの関数を作成することになっていた。


というわけで書いてみた。


>>> pt1 = [3.5, 3]
>>> pt2 = [0.5, 1]
>>> def segment(pt1, pt2):
...     return [[i * 0.01 * pt1[0] + (100 - i)/100 * pt2[0], i * 0.01 * pt1[1] + (100 - i)/100 * pt2[1]] for i in range(101)]
>>> L = segment(pt1, pt2)

Lに2点の端点から形成される線分上にある点を100個返してみて、この結果をプロットしてみた。


結果は


vector_add


こうなった。