考え方はこちらをクリック
#環境
python3.7
#問題
以下のような図の__点P__が図形の中か外かを計算する。
__O(0,0)__は__原点__を表している。また、A(2,2)、B(3,1)、__C(3,3)__は__図形の頂点__を表している。__P(x,y)__は__任意の点__である。
#計算
下図のように__外積の向きが同じ__になるように計算する。
座標の定義↓
import numpy
#点Aの座標
A = numpy.array((6, 5))
#点Bの座標
B = numpy.array((3, 1))
#点Cの座標
C = numpy.array((9, 1))
外積計算↓
#点Pが図形の中にあるかどうか
def p(x, y):
#点Pの座標
P = numpy.array((x, y))
#ベクトルBPとベクトルBAの外積
abp = numpy.outer(P-B, A-B)
#ベクトルBCとベクトルBPの外積
pbc = numpy.outer(C-B, P-B)
#ベクトルCAとベクトルCPの外積
apc = numpy.outer(A-C, P-C)
#ベクトルBPとベクトルBAの外積の行列式
abp = numpy.linalg.det(abp)
#ベクトルBCとベクトルBPの外積の行列式
pbc = numpy.linalg.det(pbc)
#ベクトルCAとベクトルCPの外積の行列式
apc = numpy.linalg.det(apc)
#ベクトルBPとベクトルBAの外積の行列式が他の行列式の符号と一致したら、Trueを返す
if numpy.sign(abp)==numpy.sign(pbc) and numpy.sign(abp)==numpy.sign(pbc):
return True
#ベクトルBPとベクトルBAの外積の行列式が他の行列式の符号と一致しなかったら、Falseを返す
else:
return False
#すべてのコードと結果
コード
code.py
import numpy
#点Aの座標
A = numpy.array((6, 5))
#点Bの座標
B = numpy.array((3, 1))
#点Cの座標
C = numpy.array((9, 1))
#点Pが図形の中にあるかどうか
def p(x, y):
#点Pの座標
P = numpy.array((x, y))
#ベクトルBPとベクトルBAの外積
abp = numpy.outer(P-B, A-B)
#ベクトルBCとベクトルBPの外積
pbc = numpy.outer(C-B, P-B)
#ベクトルCAとベクトルCPの外積
apc = numpy.outer(A-C, P-C)
#ベクトルBPとベクトルBAの外積の行列式
abp = numpy.linalg.det(abp)
#ベクトルBCとベクトルBPの外積の行列式
pbc = numpy.linalg.det(pbc)
#ベクトルCAとベクトルCPの外積の行列式
apc = numpy.linalg.det(apc)
#ベクトルBPとベクトルBAの外積の行列式が他の行列式の符号と一致したら、Trueを返す
if numpy.sign(abp)==numpy.sign(pbc) and numpy.sign(abp)==numpy.sign(pbc):
return True
#ベクトルBPとベクトルBAの外積の行列式が他の行列式の符号と一致しなかったら、Falseを返す
else:
return False
print(p(3, 1))#出力結果:True
print(p(2, 2))#出力結果:True
print(p(8,14))#出力結果:False
補足
__点Pを線上__にあるとした時、点Pは__図形の中にある__ものとして計算している。