×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,191,227명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

가끔은 개발을 하다보면 어떤 도형을 그려야 할 때가 있을 수 있고, 그 도형의 좌표를 시계방향으로 정렬해야 하는 상황이 올 수도 있다.

 

Convex hull 알고리즘에서도 반시계 방향으로 좌표들을 정렬한다.

https://www.crocus.co.kr/1288

 

컨벡스 헐 알고리즘(Convex Hull Algorithm)

목차 1. 컨벡스 헐 알고리즘(Convex Hull Algorithm)이란? 2. 컨벡스 헐 알고리즘(Convex Hull Algorithm) 동작 원리 3. 컨벡스 헐 알고리즘(Convex Hull Algorithm) 구현 4. 관련 문제 1. 컨벡스 헐 알고리즘(Con..

www.crocus.co.kr

 

이런 좌표들을 오름차순 / 내림차순으로 정렬하는 것이 아닌 시계방향 / 반시계방향으로 정렬하는 코드를 확인해보자.

 

 

[Sort solution : First of all, calculate the average point, and then sort everything around it by angle.]

 

import java.awt.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Crocus {
    public static void main(String[] args) {
        ArrayList<Point> points = new ArrayList<>();

        points.add(new Point(5,0));
        points.add(new Point(5,15));
        points.add(new Point(0,10));
        points.add(new Point(10,10));

        System.out.println("=== Clockwise sort ===");
        sortPointsClockwise(points);
        for(Point i : points){
            System.out.println(i.x + " " + i.y);
        }

        System.out.println("=== Counter Clockwise sort ===");
        sortPointsCounterClockwise(points);
        for(Point i : points){
            System.out.println(i.x + " " + i.y);
        }

    }

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

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

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

        Comparator<Point> comparator = (lhs, 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<Point> points) {
        sortPointsClockwise(points);
        Collections.reverse(points);
    }
}

 

 

https://stackoverflow.com/questions/10460300/how-to-check-if-vertex-array-is-clockwise

 

How to check if VERTEX ARRAY is clockwise?

Solved, used this code: if ( !isClockwise(TempVectArray) ) { Collections.reverse(TempVectArray); } ... private boolean isClockwise(ArrayList arl){ Iterator it = arl.

stackoverflow.com

 

반응형