Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if VERTEX ARRAY is clockwise?

Tags:

java

android

Solved, used this code:

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

Suppose I get a vertex array from the user tapping on the screen, but need it to be clockwise.

Maybe you know of some standard methods to check if it is clockwise and if it's not, then make it clockwise?

enter image description here

Thanks!

like image 215
Roger Travis Avatar asked Dec 05 '25 15:12

Roger Travis


1 Answers

One way to do it is to first calculate the average point, and then sort everything around it by angle. Should be something like this:

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);
}
like image 186
Marcus Forsell Stahre Avatar answered Dec 08 '25 18:12

Marcus Forsell Stahre



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!