質問

私は私が一群のラインセッグから構築された経路計を持っています、そして私はそれを2つの道具形状に分割した。これが私がこの写真が意味するものです:

http://i30.tinypic.com/2noyvm.png

私はLinegentsを通過し、単純な線オブジェクトの配列(単純なオブジェクトw / Aポイント1、Point2プロパティ、1行を表すように)の配列を作成することができます。しかし、私はある線が交差する線の一端にあるのか、そしてどの線が交差する線のもう一方の端にあるかを理解する必要があります...

これは、ジオメトリの組み合わせ方法の反対のようなものです、私がまとめようとしているジオメトリ除算方法のようなものです。

任意のアイデア?

ありがとう!

役に立ちましたか?

解決

ええと、楽しかったです、ここに私がしたことです(これがより効率的な方法がある場合の「正しい」方法である場合は正直にはわかりません)。

  1. 分割線がY軸上にあるようにジオメトリを移動させる変換を作成します。
  2. ジオメトリの各行に - x <0の場合、左側の場合、x> 0の場合、線がy軸を横切るとそれを2行に分割します。
  3. ステップ1からの変換の逆数を使用して両方の行のリストを変換し、それらからジオメトリを再構築します。
  4. これは、2点で定義されたジオメトリと行を取り、2つのジオメトリを返し、

    を返すスプットメトリメソッドです。
        private void SplitGeometry(Geometry geo, Point pt1, Point pt2, out PathGeometry leftGeo, out PathGeometry rightGeo)
        {
            double c = 360.0 + 90.0 - (180.0 / Math.PI * Math.Atan2(pt2.Y - pt1.Y, pt2.X - pt1.X));
            var t = new TransformGroup();
            t.Children.Add(new TranslateTransform(-pt1.X, -pt1.Y));
            t.Children.Add(new RotateTransform(c));
            var i = t.Inverse;
            leftGeo = new PathGeometry();
            rightGeo = new PathGeometry();
            foreach (var figure in geo.GetFlattenedPathGeometry().Figures)
            {
                var left = new List<Point>();
                var right = new List<Point>();
                var lastPt = t.Transform(figure.StartPoint);
                foreach (PolyLineSegment segment in figure.Segments)
                {
                    foreach (var currentPtOrig in segment.Points)
                    {
                        var currentPt = t.Transform(currentPtOrig);
                        ProcessLine(lastPt, currentPt, left, right);
                        lastPt = currentPt;
                    }
                }
                ProcessFigure(left, i, leftGeo);
                ProcessFigure(right, i, rightGeo);
            }
        }
    
        private void ProcessFigure(List<Point> points, GeneralTransform transform, PathGeometry geometry)
        {
            if (points.Count == 0) return;
            var result = new PolyLineSegment();
            var prev = points[0];
            for (int i = 1; i < points.Count; ++i)
            {
                var current = points[i];
                if (current == prev) continue;
                result.Points.Add(transform.Transform(current));
                prev = current;
            }
            if (result.Points.Count == 0) return;
            geometry.Figures.Add(new PathFigure(transform.Transform(points[0]), new PathSegment[] { result }, true));
        }
    
        private void ProcessLine(Point pt1, Point pt2, List<Point> left, List<Point> right)
        {
            if (pt1.X >= 0 && pt2.X >= 0)
            {
                right.Add(pt1);
                right.Add(pt2);
            }
            else if (pt1.X < 0 && pt2.X < 0)
            {
                left.Add(pt1);
                left.Add(pt2);
            }
            else if (pt1.X < 0)
            {
                double c = (Math.Abs(pt1.X) * Math.Abs(pt2.Y - pt1.Y)) / Math.Abs(pt2.X - pt1.X);
                double y = pt1.Y + c * Math.Sign(pt2.Y - pt1.Y);
                var p = new Point(0, y);
                left.Add(pt1);
                left.Add(p);
                right.Add(p);
                right.Add(pt2);
            }
            else
            {
                double c = (Math.Abs(pt1.X) * Math.Abs(pt2.Y - pt1.Y)) / Math.Abs(pt2.X - pt1.X);
                double y = pt1.Y + c * Math.Sign(pt2.Y - pt1.Y);
                var p = new Point(0, y);
                right.Add(pt1);
                right.Add(p);
                left.Add(p);
                left.Add(pt2);
            }
        }
    
    .

他のヒント

交差線のどの側が交差線に対する線路終点の行列式の符号を計算するかを把握する方法。陽性は片側、負はもう一方です。

ラインセグメントの内部内で、より洗練された交差点を持っている場合は、二重方向のエッジと頂点のグラフを構築し、交差する線と各ポリゴンエッジの交点を計算する必要があります。次に、ラインがエッジと交差してグラフを後退させて、もう1つに従うようにポリゴンを構築して、頂点を挿入します。

これの実装を探している場合は、純トポロジースイート、主にGISに使用されている間、これはこのような一般的な計算形状の問題にも役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top