LineStringにArrowheadを追加
[[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を加えることで、矢印の頭の三角形となる

