DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[
最新記事及び返信フォームをトピックトップへ
]
[ トピック内全9記事(1-9 表示) ] <<
0
>>
■33012
/ inTopicNo.1)
図形の当たり判定が上手くいかない
▼
■
□投稿者/ 西野
一般人(1回)-(2015/07/02(Thu) 14:11:12)
環境/言語:[Win7 64bit , C# , .NET v4.5]
分類:[.NET]
はじめまして、西野と申します。
現在、図形の内外判定の処理を実装しています。
多角形の図形内に指定したポイントが入っているかという当たり判定なんですが、
図形が凹型の時にポイントが図形外にあってもtrueが返ってきてしまいます。
public Boolean IsInside(List<double> pointLat, List<double> pointLon, double resultPointLat, double resultPointLon)
{
// StreamGeometoryのインスタンスを生成
StreamGeometry geometry = new StreamGeometry();
geometry.FillRule = FillRule.EvenOdd;
using (StreamGeometryContext ctx = geometry.Open())
{
// ポリゴンの開始点を設定
ctx.BeginFigure(new System.Windows.Point(pointLon[0], pointLat[0]), true, true);
// 図形の座標点の数だけ開始点から続く座標を設定
for (int i = 1; i < pointLat.Count - 1; i++ )
{
ctx.LineTo(new System.Windows.Point(pointLon[i], pointLat[i]), true, false);
}
}
// 図形の中に指定したポイントがあるかどうかを判定(true:図形の内側にポイントがある, false:図形の外側にポイントがある)
Boolean result = geometry.FillContains(new System.Windows.Point(resultPointLon, resultPointLat));
return result;
}
何かお気づきの点やご存知のことがありましたら、ご教授お願いいたします。
引用返信
削除キー/
編集
削除
■33013
/ inTopicNo.2)
Re[1]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ Hongliang
大御所(498回)-(2015/07/02(Thu) 14:34:20)
> for (int i = 1; i < pointLat.Count - 1; i++ )
なんで-1してるんでしょう?
引用返信
削除キー/
編集
削除
■33014
/ inTopicNo.3)
Re[2]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ 西野
一般人(2回)-(2015/07/02(Thu) 14:51:54)
■
No33013
に返信(Hongliangさんの記事)
> > for (int i = 1; i < pointLat.Count - 1; i++ )
> なんで-1してるんでしょう?
早速の返信ありがとうございます。
pointLatとpointLonのリストには座標が格納されていて、
このリストの一番最初と一番最後の要素は同じ座標が入っています。
-1をしている理由としては、
ctx.BeginFigure(new System.Windows.Point(pointLon[0], pointLat[0]), true, true);
このBeginFigureの第三引数で図形を閉じるよう設定しているため、
同じ座標にポイントを作らないようにするためです。
引用返信
削除キー/
編集
削除
■33015
/ inTopicNo.4)
Re[3]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ Hongliang
大御所(499回)-(2015/07/02(Thu) 15:03:56)
FillContainsには引数3つのオーバーロードがありますが、そのtorelanceの影響は考えられませんか?
既定(引数1つバージョンで使うtorelance)ではいくらか緩めに見ているようですが。
あとは、具体的な座標を挙げてみたほうがやりとりしやすいかと思います。
引用返信
削除キー/
編集
削除
■33017
/ inTopicNo.5)
Re[4]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ 西野
一般人(5回)-(2015/07/02(Thu) 15:30:38)
引数3つのFiliContainsメソッドを試してみましたが、結果変わらずでした。
試した値としては、0.000001 , 0.001 , 0,1 , 1です。
情報ありがとうございます。
情報不足で申し訳ありません。
今実際に試している座標は以下の通りです。
pointLon pointLat
140.9512430127 40.9063394118
140.9510805933 40.9063183244
140.9509780316 40.9062487251
140.9508904313 40.9061148999
140.9508923790 40.9060752729
140.9508947805 40.9060237580
140.9510183312 40.9058809820
140.9510331385 40.9058639462
140.9510931782 40.9057845448
140.9511502467 40.9057030752
140.9511079830 40.9056323337
140.9510115445 40.9056013625
140.9510309131 40.9054791357
140.9511437543 40.9053889636
140.9512865689 40.9052667006
140.9514791408 40.9052241768
140.9516132170 40.9051945007
140.9517480021 40.9051630226
140.9521101174 40.9050782670
140.9523839359 40.9053330256
140.9528225110 40.9051263419
140.9529503515 40.9050619088
140.9530729606 40.9050586296
140.9529252581 40.9050351880
140.9527173682 40.9050075758
140.9524583545 40.9049992882
140.9521511840 40.9050103219
140.9517612120 40.9050492673
140.9514163373 40.9050839326
140.9511920629 40.9051205449
140.9509662663 40.9051690459
140.9507600695 40.9052259919
140.9506953172 40.9052582081
140.9506937762 40.9052593804
140.9505749957 40.9053473066
140.9504304193 40.9054810077
140.9504580281 40.9055210550
140.9505111425 40.9056200635
140.9505305540 40.9056560665
140.9505517189 40.9057439405
140.9505973899 40.9059967736
140.9506397366 40.9061146149
140.9507002140 40.9062152368
140.9507756025 40.9062901774
140.9509023190 40.9063929832
140.9510391436 40.9065060451
140.9512430127 40.9063394118
引用返信
削除キー/
編集
削除
■33018
/ inTopicNo.6)
Re[5]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ 西野
一般人(6回)-(2015/07/02(Thu) 15:35:31)
すみません。
補足です。
pointLat…図形の緯度座標
pointLon…図形の経度座標
resultPointLat(40.90575266665)・・・判定したいポイントの緯度座標
resultPointLon(140.95175168995002)・・・判定したいポイントの経度座標
引用返信
削除キー/
編集
削除
■33023
/ inTopicNo.7)
Re[6]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ Hongliang
大御所(500回)-(2015/07/02(Thu) 18:32:47)
座標間の距離が極端に短いと、計算精度の問題かどうかは分かりませんがそういうことになるみたいですね。
単純な回避策としては、各座標のx,yをそれぞれ2^16倍ぐらいするとか、どうでしょう。
// 140.95175168995002はdoubleで表現しきれないような…。
引用返信
削除キー/
編集
削除
■33034
/ inTopicNo.8)
Re[7]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ 魔界の仮面弁士
大御所(980回)-(2015/07/03(Fri) 12:39:55)
■
No33023
に返信(Hongliangさんの記事)
> 座標間の距離が極端に短いと、計算精度の問題かどうかは分かりませんがそういうことになるみたいですね。
> 単純な回避策としては、各座標のx,yをそれぞれ2^16倍ぐらいするとか、どうでしょう。
なるほど…。
> // 140.95175168995002はdoubleで表現しきれないような…。
decimal なら表現できますが、肝心の System.Windows.Point が
double 型精度なので、そこは致し方ないところですね。
ちなみに double 型の精度は二進小数52桁(decimal は 128桁)なので、
(a案)10001100.111100111010010111111111101011100011111101111
(b案)10001100.111100111010010111111111101011100011111110000
が、十進数 140.95175168995002 の近傍値となる二進小数となります。
a の方は 140.951751689949986712235840968787670135498046875 相当
b の方は 140.95175168995001513394527137279510498046875 相当
引用返信
削除キー/
編集
削除
■33036
/ inTopicNo.9)
Re[8]: 図形の当たり判定が上手くいかない
▲
▼
■
□投稿者/ 西野
一般人(7回)-(2015/07/03(Fri) 17:00:04)
Hongliang様
魔界の仮面弁士様
大変遅くなり申し訳ありません。
>単純な回避策としては、各座標のx,yをそれぞれ2^16倍ぐらいするとか、どうでしょう。
このアドバイスを参考に、以下のように実装したところ問題なく内外判定が出来るようになりました。
今回の座標のパターンですと、小数点第5位以下の値の変化で図形を描画していたので、100000をかける事で桁を変更しました。
やはり変化している値が小さすぎたことが原因でした。
みなさんのお力添えのおかげで解決することができました。
ありがとうございました。
また、お世話になることがあるかも知れませんが、その時もよろしくお願いいたします。
西野
解決
済
み!
引用返信
削除キー/
編集
削除
トピック内ページ移動 / <<
0
>>
このトピックに書きこむ
過去ログには書き込み不可
Mode/
通常管理
表示許可
Pass/
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-