質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

輪郭内にある座標は輪郭内にあると正しく判定したい

kinokoman
kinokoman

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0リアクション

0クリップ

1462閲覧

投稿2021/12/08 04:00

輪郭内の内外判定を正しく判定したい

輪郭線と座標をプロットすると輪郭線内に座標があると目でわかるのですが、プログラムが判定すると一部の外積が正になってしまい輪郭線外にあると判定され、うまいこといきません。
外積が正になる部分を回避してうまいこと判定する方法を知りたいです。

輪郭線と判定したい座標点をプロットした画像

Python

import numpy as np import copy import pandas as pd import matplotlib.pyplot as plt #多角形の端の座標点を決める #(x,y)>(0,0) c = [np.array([2,1]),np.array([1,3]),np.array([1,7]),np.array([3,6]),np.array([4,8]),np.array([6,9]),np.array([8,8]),np.array([9,6]),np.array([8,3]),np.array([6,1])] name_list = [] for i in range(1,len(c)+1): x = 'c'+str(i) name_list.append(x) #x = 'c{}'.format(i) # = np.array([3,4]) #求めたい任意座標点の入力 #(X,Y)>(0,0) point =np.array([7 ,8]) #多角形と任意座標の可視化 x = [] y = [] for i in range(len(c)): #c[i] = 'c'+str(i) #str(name_list[i-1]) = c[i-1] exec('x_num = c[i][0]'.format(i)) x.append(x_num) exec('y_num = c[i][1]'.format(i)) y.append(y_num) x.append(c[0][0]) y.append(c[0][1]) plt.plot(x, y, label="test") plt.plot(point[0], point[1],marker="o",linestyle='None',markersize=6, color='red') plt.show() def inside(point,c): #全てのベクトル計算 for i in range(1,len(c)+1): if i < len(c): print(c[i]) kakomi = 'vector_c{}c{} = (c[i]-c[i-1])'.format(i,i+1) exec(kakomi) uchigawa = 'vector_c{}point = (point-c[i-1])'.format(i,i) exec(uchigawa) if i == len(c): kakomi2 = 'vector_c{}c1 = (c[0]-c[i-1])'.format(i,i) exec(kakomi2) uchigawa2 = 'vector_c{}point = (point-c[i-1])'.format(i,i) exec(uchigawa2) #全ての外積計算 for i in range(1,len(c)+1): if i < len(c): get = 'outer_product_c{}c{}_point = np.cross(vector_c{}c{}, vector_c{}point)'.format(i,i+1,i,i+1,i) exec(get) if i == len(c): get2 = 'outer_product_c{}c1_point = np.cross(vector_c{}c1, vector_c{}point)'.format(i,i,i) exec(get2) #外積結果をリストに内包する list =[] for i in range(1,len(c)+1): if i < len(c): s = eval('outer_product_c{}c{}_point'.format(i,i+1)) list.append(s) if i == len(c): t = eval('outer_product_c{}c1_point'.format(i)) list.append(t) print(list) #リスト内に1つでも正数があれば、Trueで外側 #なければ、Falseで内側 if any((x > 0 for x in list)) == True: print('外側にあります') else: print('内側にあります') if __name__ == '__main__': x = inside(point,c)

"実行結果"
[array(-17), array(-24), array(8), array(-6), array(-3), array(-1), array(-2), array(-8), array(-12), array(-28)]
外側にあります

このように、内側にある座標も外側判定されてしまいます。
回避する方法をご教授いただけたら幸いです。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。