삼각형의 넓이를 구하는 알고리즘
먼저 수학적으로 평면상의 삼각형의 넓이를 구하는 방법을 알아보자.
출처 : http://blog.naver.com/dalsapcho/20131270309
S: 삼각형의 넓이, a,b,c: 삼각형 각 변의 길이, h: 삼각형의 높이, R:삼각형 외접원의 반지름, r:삼각형 내접원의 반지름, x1,y1,x2,y2,x3,y3: 삼각형 꼭지점의 좌표
1번 공식은 삼각형 넓이의 정의이며 2번 공식이 기본식으로 나머지식들이 유도된다. 유도되는 과정에서 코사인제2법칙, 정점과 직선사이의 거리, 직선의 방정식이 활용된다. 3번은 헤론의 공식이다.
위 출처의 6가지 공식을 정리해서 알고리즘에 적용할 수 있는 수학적 공식은 이렇게 된다.
삼각형의 한변의 길이와 높이를 알때 : 1번 공식
삼각형의 두변의 길이와 끼인각을 알때 : 2번 공식
삼각형의 세변의 길이를 알때 : 3번 공식
삼각형 세변의 좌표를 알때 : 6번 공식
내접원과 외접원의 반지름을 알아도 3번공식이 있기 때문에 꼭 4,5번 공식을 알고리즘에 활용할 이유는 적어보인다.
특히 삼각형 세변의 좌표를 알때가 많이 사용될듯 한데 꼭지점중 하나를 원점으로 이동하여 삼각형을 평행이동시키면 넓이는 동일하기때문에 공식이 아래와 같이 간단해진다.
S = |(X1 * Y2) - (X2 * Y1)|/2
이를 자바로 구현해보면 아래와 같다.
입력 : X1 Y1 X2 Y2 X3 Y3 의 좌표를 공백으로 구분하여 한줄로 입력
import java.io.*;
import java.util.*;
public class Triangle {
public static void main(String[] args) throws Exception{
int o_x,o_y;
int[][] dot = new int[3][2];
float answer;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0;i<3;i++)
for(int j=0;j<2;j++)
dot[i][j] = Integer.parseInt(st.nextToken());
o_x = dot[2][0]; // x3
o_y = dot[2][1]; // y3
for(int i=0;i<3;i++) // 평행이동
for(int j=0;j<2;j++){
if (j==0)
dot[i][j] -= o_x;
else
dot[i][j] -= o_y;
}
answer = (float)Math.abs((dot[0][0]*dot[1][1] - dot[1][0]*dot[0][1]))/2;
System.out.println(answer);
}
}
'SW > 알고리즘' 카테고리의 다른 글
위상정렬 Topological sort (0) | 2017.08.18 |
---|---|
이진탐색 binary search (0) | 2017.08.08 |
재귀호출 Recursive call (0) | 2017.01.22 |
(a+b)%c = (a%c+b%c)%c 증명 (0) | 2017.01.12 |
부분 문자열 일치찾기 (0) | 2017.01.09 |