はじめに
点と直線の距離をプログラムで求める関数を作りました。
ついでに最小距離になる点を求める関数も作っておきました。
ソースコード
もっと簡単に書けるかもしれないですが、忘備録なのでお手柔らかに。
点と直線の距離
点と直線の距離公式を使って距離を算出します。
直線を構成するパラメータと点の座標をそれぞれ引数として渡します。
import math #sqrt関数 #点と直線の距離 def Calc_distance(a,b,c,point_x,point_y): #直線ax+by+c=0 点(x0,y0) numer = abs(a*point_x + b*point_y + c) #分子 denom = math.sqrt(pow(a,2)+pow(b,2)) #分母 return numer/denom #計算結果
最小距離になる点
先ほど作成した関数を利用して最小距離になる点を求めます。
こちらも直線を構成するパラメータと点の座標リストをそれぞれ引数として渡します。
#直線に最も近い点を探索 def Min_distance(a,b,c,points): #直線ax+by+c=0 点([x,y]) min_point = 0 #最小距離になる点の要素番号 for i in range(len(points)-1): #リスト長-1回ループ if Calc_distance(a,b,c,*points[min_point]) > Calc_distance(a,b,c,*points[i+1]): #距離の大小比較 min_point = i+1; #要素番号の更新 return min_point #要素番号
実行
直線x+y-1=0に対し点(1,2)(1,0)を試してみます。
print(Calc_distance(1,1,-1,1,2)) print(Calc_distance(1,1,-1,1,0)) points = [[1,2],[1,0]] print(Min_distance(1,1,-1,points))
前者は√2,後者は0なので想定通りの結果が得られました。
1.414213562373095 0.0 1
最後に
実際大量に計算するならこういうしょぼい関数も作っておいた方が便利ですよね。
コメント