1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【python】二次元系 点図形内外問題

Last updated at Posted at 2020-10-11

考え方はこちらをクリック
#環境
python3.7
#問題
以下のような図の__点P__が図形の中か外かを計算する。
triangle.jpg

__O(0,0)__は__原点__を表している。また、A(2,2)B(3,1)、__C(3,3)__は__図形の頂点__を表している。__P(x,y)__は__任意の点__である。
#計算
下図のように__外積の向きが同じ__になるように計算する。
triangle3.jpg

座標の定義↓

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は__図形の中にある__ものとして計算している。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?