9

私はこれに非常に似た質問があります:

線がC#の平面と交差するかどうかを知る方法は?

線が任意のポリゴンと交差しているかどうかを確認するメソッド(C#)を探しています。

Chris Marasti-Georgによるアルゴリズムは非常に役に立ちましたが、最も重要な方法、つまり線間交叉が欠けていたと思います。

Chris Marasti-Georgのコードを完成させるための線交差法を知っている人はいますか?

C#にこれのための組み込みコードはありますか?

この方法は、禁止領域機能で拡張されたBingMapsアルゴリズムで使用するためのものです。結果のパスは、禁止領域(任意のポリゴン)を通過してはなりません。

4

4 に答える 4

22

.NETFrameworkに組み込まれているエッジ検出用の組み込みコードはありません。

必要なことを実行するコード(C#に移植)は次のとおりです(実際のアルゴリズムはGoogleグループのcomp.graphics.algorithmsにあります):

public static PointF FindLineIntersection(PointF start1, PointF end1, PointF start2, PointF end2)
{
    float denom = ((end1.X - start1.X) * (end2.Y - start2.Y)) - ((end1.Y - start1.Y) * (end2.X - start2.X));

    //  AB & CD are parallel 
    if (denom == 0)
        return PointF.Empty;

    float numer = ((start1.Y - start2.Y) * (end2.X - start2.X)) - ((start1.X - start2.X) * (end2.Y - start2.Y));

    float r = numer / denom;

    float numer2 = ((start1.Y - start2.Y) * (end1.X - start1.X)) - ((start1.X - start2.X) * (end1.Y - start1.Y));

    float s = numer2 / denom;

    if ((r < 0 || r > 1) || (s < 0 || s > 1))
        return PointF.Empty;

    // Find intersection point
    PointF result = new PointF();
    result.X = start1.X + (r * (end1.X - start1.X));
    result.Y = start1.Y + (r * (end1.Y - start1.Y));

    return result;
 }
于 2009-07-13T15:22:41.783 に答える
3

少し話題から外れていますが、線が無限である場合は、はるかに簡単な解決策があると思います。

すべての点が線の同じ側にある場合、線はポリゴンを通過しません。

これらの2つの助けを借りて:

私はこの小さな宝石を手に入れました:

  public class PointsAndLines
  {
    public static bool IsOutside(Point lineP1, Point lineP2, IEnumerable<Point> region)
    {
      if (region == null || !region.Any()) return true;
      var side = GetSide(lineP1, lineP2, region.First());
      return
        side == 0
        ? false
        : region.All(x => GetSide(lineP1, lineP2, x) == side);
    }

    public static int GetSide(Point lineP1, Point lineP2, Point queryP)
    {
      return Math.Sign((lineP2.X - lineP1.X) * (queryP.Y - lineP1.Y) - (lineP2.Y - lineP1.Y) * (queryP.X - lineP1.X));
    }
  }
于 2013-04-26T15:12:15.603 に答える
1

Silverlightマッププロジェクトでポリゴン間の衝突を検出するために、クリッパーライブラリを使用しています。

商用利用は無料で、サイズが小さく、パフォーマンスが高く、非常に使いやすいです。

クリッパーのウェブページ

于 2011-07-15T14:19:46.803 に答える
0

この記事は役立つようです

http://www.codeproject.com/KB/recipes/2dpolyclip.aspx

このコードは、線がポリゴンの境界と交差する場所を正確に決定する2次元のポリゴンクリッピングアルゴリズムです。このコードは、完全に任意の形状の凹多角形と凸多角形の両方で機能し、任意の線の方向を処理できます。

于 2009-07-13T13:35:58.250 に答える