본문 바로가기

Algorithm/Stamps

[JAVA] 신발끈 공식

좌표평면상의 좌표로 구성된 다각형의 면적을 구하는 공식이다. 좌표값이 다갹형을 구성하는 시계 또는 반시계 방향으로 주어져야 사용 가능하고 변이 교차하는 경우는 사용할 수 없어 쓰임새가 제한적이다.(다시 볼 일 없다는 뜻) 

 

사실 우리는 이 공식을 고등학생 때 사용한 적이 있어요

 

계산법은 위 그림과 같이 [{(적색 화살표의 곱의 합) - (청색 화살표의 곱의 합)} / 2] 이다.

 

public class Main {
    static BufferedReader br;
    static StringTokenizer st;
    static StringBuilder sb;

    public static void main(String[] args) throws Exception { // 사용 예
        Point[] pArr = new Point[4];
        pArr[0] = new Point(0, 0);
        pArr[1] = new Point(0, 10);
        pArr[2] = new Point(10, 10);
        pArr[3] = new Point(10, 0);
        System.out.println(shoelace(pArr));
    }

    static double shoelace(Point[] pArr) { // 신발끈 공식
        double sum1 = 0;
        double sum2 = 0;
        for (int i = 0; i < pArr.length; i++) {
            if (i == pArr.length - 1) {
                sum1 += pArr[i].x * pArr[0].y;
                sum2 += pArr[i].y * pArr[0].x;
                continue;
            }
            sum1 += pArr[i].x * pArr[i + 1].y;
            sum2 += pArr[i].y * pArr[i + 1].x;
        }
        return Math.abs(sum1 - sum2) / 2;
    }

    static class Point {	//좌표 클래스
        Double x, y;

        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }
}

'Algorithm > Stamps' 카테고리의 다른 글

[JAVA] 그래프와 다익스트라  (0) 2024.11.03
[C#, JAVA] n이하의 소수 리스트  (0) 2022.08.19
[C#] 세그먼트 트리  (0) 2022.08.17