どのように伝えば線と交差するポリゴンクライアントまで、フルのC#?
-
12-09-2019 - |
質問
あると思いますが、どのように非常に類似す:
昼間のお仕事をお持ちでも法(C#)がかば線が交差を任意の多角形を作成します。
と思い、 アルゴリズムによるクリスMarasti-ゲオルク したものですが、最も重要な方法、すなわち線。
なんだろうけど、日本人の交差点方法を完全にクリスMarasti-ゲオルクのコードはも同じようなものは?
ある内蔵コードがこのクライアントまで、フルのC#?
この方法を使うことができるのは、ビングの地図アルゴリズムの強化に禁断の領域特徴です。この結果、道はならないの通り禁止区域(任意のポリゴン).
解決
NETフレームワークに組み込まれたエッジ検出のための組み込みコードはありません。
ここでは、(実際のアルゴリズムは、Googleのグループにcomp.graphics.algorithmsで発見された)必要なものを行います(C#2に移植された)コードです
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;
}
他のヒント
若干話がそれますが、それ以上広くできない場合はのは 無限 思いがより簡単な解
の線を経由しないポリゴンの場合すべての点で同じ 側 します。
から:
私はこの逸品:
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));
}
}
私たちのSilverlightマッププロジェクトにポリゴン間の衝突を検出するために、我々はクリッパーライブラリを使用している:
商用利用、小型サイズ、優れたパフォーマンスと、非常に使いやすいのための無料ます。
この記事では、それが役立つようになります。
http://www.codeproject.com/KB/recipes/2dpolyclip.aspx の
このコードは、線ポリゴン境界と交差する正確に場所を決定二次元ポリゴンクリッピングアルゴリズムです。このコードは、完全に任意の形状の凹凸多角形の両方のために動作し、任意の行方向に対応することが可能である。