LineStringにArrowheadを追加
[[x, y], [x, y], …] で記述されたLineString(点を順につなげた線)がある。
これを座標上に描画するのだが、方向(どちらが始点か)が一目見てわかるようにしたいとする。
いろいろ方法はあるが、とりあえず汎用的には、線分の終点にアローヘッド(矢印の頭)を付け加えて描画するとよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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を加えることで、矢印の頭の三角形となる