【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.pyimport 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는 도형에있는 것으로 계산됩니다.
Reference
이 문제에 관하여(【python】2차원계 점 도형 내외 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ShotaSuzuki-jr/items/4c40790fb6e25847dcfc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
다음과 같은 그림의 점 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.pyimport 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는 도형에있는 것으로 계산됩니다.
Reference
이 문제에 관하여(【python】2차원계 점 도형 내외 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ShotaSuzuki-jr/items/4c40790fb6e25847dcfc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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는 도형에있는 것으로 계산됩니다.
Reference
이 문제에 관하여(【python】2차원계 점 도형 내외 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ShotaSuzuki-jr/items/4c40790fb6e25847dcfc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)