1

次の場合、 ArratList<Segment>(N セグメント - 配列サイズは N) があります。

public class Segment {
    Node vertex_1;
    Node vertex_2;
}

public class Node {
    double latitude;
    double longitude;
}

そして 1 つの静的ポイント - 原点。質問に関して各値が true/false である (サイズ N)を取得するためにGeoToolsを使用する方法:ArrayList<boolean>

原点からセグメントの両端までの 2 本の線分は、途中で他のセグメントと交差していますか? 注: セグメントは互いに十分に近いため、大圏の問題はここにはありません

たとえば、原点からセグメント 1 の 2 番目のエッジまでの赤い線が途中のセグメント 3 で交差するため、結果は {true, false, false} になります。

ここに画像の説明を入力

この質問はこの Stackoverflow Qに似ていますが、違いは、地理測定単位 (緯度/経度) を極面に変換し、外積などの数学計算を実行するアルゴリズムを実装する代わりに、GeoTools で作業したいということです。難しくはありませんが、バグの可能性があります。オープン ソース ライブラリが既に用意されている場合は、それを使用することをお勧めします。

この質問は GIS ソリューションに関するものなので、gis stackexchangeにも質問しました。

4

1 に答える 1

2

Coordinate(あなたのNode ) およびLineString(あなたのSegment ) オブジェクトを使用して問題を解決できます。

// origin point
Coordinate origin = new Coordinate(5, 0);
// segments
ArrayList<LineString> segmentList = new ArrayList();
LineString segmentA = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 5), new Coordinate(5, 5)});
segmentList.add(segmentA);
LineString segmentB = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(4, 3), new Coordinate(6, 3)});
segmentList.add(segmentB);
LineString segmentC = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(7, 4), new Coordinate(10, 4)});
segmentList.add(segmentC);
// result list
ArrayList<Boolean> resultList = new ArrayList();
for(int i = 0; i < segmentList.size(); i++){
    // flag to indicate intersection
    boolean intersectionResult = false;
    // get current segment
    LineString currentSegment = segmentList.get(i);
    // get segments from segment pooints to origin
    LineString startSegment = new GeometryFactory().createLineString(new Coordinate[]{origin, currentSegment.getStartPoint().getCoordinate()});
    LineString endSegment = new GeometryFactory().createLineString(new Coordinate[]{origin, currentSegment.getEndPoint().getCoordinate()});
    // iterate over sections
    for(int j = 0; j < segmentList.size(); j++){
        // ignore same section
        if(i != j){
            // check for intersections between segments
            if(startSegment.intersects(segmentList.get(j)) || endSegment.intersects(segmentList.get(j))){
                intersectionResult = true;
                continue;
            }
        }
    }
    // no intersection found
    resultList.add(intersectionResult);
}

// print results
for(Boolean b : resultList){
    System.out.println("intersection of segment -> " + b.booleanValue());
}
于 2016-07-17T22:22:31.280 に答える