삼각형의 넓이를 구하는 알고리즘

 

먼저 수학적으로 평면상의 삼각형의 넓이를 구하는 방법을 알아보자.

출처 : 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

+ Recent posts