DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■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/


- Child Tree -