3

解決済み、このコードを使用:

if ( !isClockwise(TempVectArray) ) { Collections.reverse(TempVectArray); }

...

private boolean isClockwise(ArrayList<Vec2> arl){
    Iterator<Vec2> it = arl.iterator();
    Vec2 pt1 = (Vec2)it.next();
    Vec2 firstPt = pt1;
    Vec2 lastPt = null;
    double area = 0.0;
    while(it.hasNext()){
        Vec2 pt2 = (Vec2) it.next();
        area += (((pt2.x - pt1.x) * (pt2.y + pt1.y)) / 2);
        pt1 = pt2;
        lastPt = pt1;
    }
    area += (((firstPt.x - lastPt.x) * (firstPt.y + lastPt.y)) / 2);
    return area < 0;
}

ユーザーが画面をタップして頂点配列を取得するとしますが、時計回りにする必要があります。

時計回りかどうかを確認し、そうでない場合は時計回りにする標準的な方法を知っているかもしれません。

ここに画像の説明を入力

ありがとう!

4

2 に答える 2

2

これを行う1つの方法は、最初に平均点を計算し、次にその周りのすべてを角度で並べ替えることです。次のようになります。

public static void sortPointsClockwise(ArrayList<PointF> points) {
    float averageX = 0;
    float averageY = 0;

    for (PointF point : points) {
        averageX += point.x;
        averageY += point.y;
    }

    final float finalAverageX = averageX / points.size();
    final float finalAverageY = averageY / points.size();

    Comparator<PointF> comparator = new Comparator<PointF>() {
        public int compare(PointF lhs, PointF rhs) {
            double lhsAngle = Math.atan2(lhs.y - finalAverageY, lhs.x - finalAverageX);
            double rhsAngle = Math.atan2(rhs.y - finalAverageY, rhs.x - finalAverageX);

            // Depending on the coordinate system, you might need to reverse these two conditions
            if (lhsAngle < rhsAngle) return -1;
            if (lhsAngle > rhsAngle) return 1;

            return 0;
        }
    };

    Collections.sort(points, comparator);
}

public static void sortPointsCounterClockwise(ArrayList<PointF> points) {
    sortPointsClockwise(points);
    Collections.reverse(points);
}
于 2012-05-05T10:08:02.157 に答える
0

ノードのシーケンス番号と位置があります。移動中に x と y の変化を保持する移動を取得します。あとは、次のような制御構造を定義するだけです。

if(movement_before is "up")
    movement should-be "up" or "up-right"
if(movement_before is "up-left")
    movement should-be "up" or "up-left" or "up-right"
etc..
于 2012-05-05T11:42:10.903 に答える