본문 바로가기
etc/어려운 수학이야기

다각형의 넓이를 구하는 방법 (모든 다각형 가능, +코딩)

by bigpicture 2023. 6. 20.
반응형

아래와 같은 다각형이 있다고 합시다. 이 다각형의 넓이를 구하는 방법은 여러가지가 있을 것입니다. 삼각형 여러개로 나눠서 구할 수도 있고, 정사각형의 넓이에서 나머지 부분을 빼서 구할 수도 있습니다. 그 외에도 방법이 더 있을 겁니다. 

오늘 소개할 방법은 어떤 다각형이던 상관없이 통하는 방법입니다. 간단한 예제로 방법을 배워봅시다. 

아래 다각형의 넓이를 구하고 싶은 상황입니다. 

먼저 아래 사각형의 넓이를 구합니다. $S_{1}$이라고 놓겠습니다. 

다음은 아래 사각형의 넓이를 구합니다. $S_{2}$이라고 놓겠습니다. 

다음은 아래 사각형의 넓이를 구합니다. $S_{3}$이라고 놓겠습니다. 

다음은 아래 사각형의 넓이를 구합니다. $S_{4}$라고 놓겠습니다. 

모아보면 아래와 같습니다. 

 

 

다각형의 넓이는 아래와 같이 구할 수 있습니다. 

 

$S_{1}+S_{2}-S_{3}-S_{4}$

 

$P_{1}$의 x좌표를 $P_{1}[x]$, y좌표를 $P_{1}[y]$라고 놓고 이 규칙을 적용하면 도형의 넓이를 아래와 같이 표현할 수도 있습니다. 

 

$S_{1}=\frac{1}{2}\left ( P_{2}[x]+P_{1}[x] \right )\left ( P_{2}[y]-P_{1}[y] \right )$
$S_{2}=\frac{1}{2}\left ( P_{3}[x]+P_{2}[x] \right )\left ( P_{3}[y]-P_{2}[y] \right )$
$-S_{3}=\frac{1}{2}\left ( P_{4}[x]+P_{3}[x] \right )\left ( P_{4}[y]-P_{3}[y] \right )$
$-S_{4}=\frac{1}{2}\left ( P_{1}[x]+P_{4}[x] \right )\left ( P_{1}[y]-P_{4}[y] \right )$

 

우리가 구하려는 넓이를 A라고 두고, 시그마 기호로 나타내면 아래와 같습니다. 

 

$A=S_{1}+S_{2}-S_{3}-S_{4}=\left [ \sum_{i=1}^{3}\frac{1}{2}\left ( P_{i+1}[x]+P_{i}[x] \right )\left ( P_{i+1}[y]-P_{i}[y] \right ) \right ]+\frac{1}{2}\left ( P_{1}[x]+P_{4}[x] \right )\left ( P_{1}[y]-P_{4}[y] \right )$

 

점의 개수가 많아져도 아래와 같이 일반화 시킬 수 있습니다. 점의 개수를 n이라고 놓겠습니다. 

$A=\left [ \sum_{i=1}^{n-1}\frac{1}{2}\left ( P_{i+1}[x]+P_{i}[x] \right )\left ( P_{i+1}[y]-P_{i}[y] \right ) \right ]+\frac{1}{2}\left ( P_{1}[x]+P_{n}[x] \right )\left ( P_{1}[y]-P_{n}[y] \right )$

위 식을 이용하여 다각형의 넓이를 구할 수 있습니다. 단, 점들이 $P_{1}$ 부터 반시계방향으로 순서대로 나열되어 있어야 합니다. 만약 점들이 $P_{1}$부터 시계방향으로 나열되어 있다면 아래와 같이 수식이 바뀝니다. 

$A=\left [ \sum_{i=1}^{n-1}\frac{1}{2}\left ( P_{i+1}[x]+P_{i}[x] \right )\left ( -P_{i+1}[y]+P_{i}[y] \right ) \right ]+\frac{1}{2}\left ( P_{1}[x]+P_{n}[x] \right )\left ( -P_{1}[y]+P_{n}[y] \right )$

점이 많아지면 손으로 구하는게 어려운데요. 위 식은 코딩에서 강력한 힘을 발휘합니다. R로 코딩해보면 아래와 같습니다. 

eostat_polygon = function(x, y, clockwise = FALSE) {
  A = 0
  
  if (clockwise == FALSE) {
    for (i in c(1:(length(x) - 1))) {
      A = A + (x[i + 1] + x[i]) * ( y[i + 1]-y[i]) * 0.5
    }
    
    A = A + (x[length(x)] + x[1]) * (y[1]-y[length(x)] ) * 0.5
  } else if (clockwise == TRUE) {
    for (i in c(1:(length(x) - 1))) {
      A = A + (x[i + 1] + x[i]) * ( -y[i + 1]+y[i]) * 0.5
    }
    
    A = A + (x[length(x)] + x[1]) * (y[length(x)] -y[1]) * 0.5
  }
  
  return(A)
}


x와 y에 점을 순서대로 입력하고 시계방향인지 반시계방향인지 입력하면 다각형 넓이를 구해주는 함수입니다. 

 

정의한 함수를 이용하여 위 예시의 다각형 넓이를 구하면 아래와 같습니다.

> x = c(1, 4, 4, 2)
> y = c(1, 2, 6, 3)
> eostat_polygon(x, y)
[1] 6.5
반응형

댓글