【python】2차원계 점 도형 내외 문제

아이디어는 여기

환경



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는 도형에있는 것으로 계산됩니다.

좋은 웹페이지 즐겨찾기