解决了,使用了以下代码:

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;
}

假设我从用户点击屏幕上得到一个顶点数组,但需要将其顺时针旋转。

也许您知道一些标准方法可以检查它是否为顺时针方向,如果不是,则使其顺时针旋转?

谢谢!

最佳答案

一种方法是首先计算平均点,然后按角度对周围的所有点进行排序。应该是这样的:

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);
}

08-17 21:34