[[x, y], [x, y], …] で記述されたLineString(点を順につなげた線)がある。
これを座標上に描画するのだが、方向(どちらが始点か)が一目見てわかるようにしたいとする。
いろいろ方法はあるが、とりあえず汎用的には、線分の終点にアローヘッド(矢印の頭)を付け加えて描画するとよい。
def add_arrowhead(coordinates): """ :param coordinates: [[x, y], [x, y], ...] """ # 矢印の傘の角度 # 今回は18degとし、cos(18), sin(18)の値を事前計算 cos, sin = 0.9510565, 0.3090170 # LineStringの最後の2点を取得 n1, n2 = coordinates[-2], coordinates[-1] vx = n2[0] - n1[0] vy = n2[1] - n1[1] nv = (vx ** 2 + vy ** 2) ** 0.5 # ベクトルサイズ(=矢印の大きさ)を一定にする # 1e-4の部分で大きさを調整 vx = vx / nv * 1e-4 vy = vy / nv * 1e-4 n3x = n2[0] + (-cos * vx - sin * vy) n3y = n2[1] + (sin * vx - cos * vy) n4x = n2[0] + (-cos * vx + sin * vy) n4y = n2[1] + (-sin * vx - cos * vy) coordinates.append([n3x, n3y]) coordinates.append([n4x, n4y]) coordinates.append(n2)
n1→n2に向かう線分のn2側に矢印を付けている。
n2→n1のベクトルをvとし、vを18度反時計方向にずらしたベクトルをn2→n3、18度時計方向にずらしたベクトルをn2→n4とする。いずれもベクトルの大きさが一定になるようにvの大きさで割って調整する。
LineStringの末尾にn3,n4,n2を加えることで、矢印の頭の三角形となる