사인법칙, 삼각형의 넓이, 코사인법칙, 외접원의 중심의 좌표 구하기 한번에 배우기

1. 문제

 

6600번: 원의 둘레 (acmicpc.net)

 

6600번: 원의 둘레

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 실수 x1, y1, x2, y2, x3, y3이 주어진다. 세 점으로 만들 수 있는 원의 지름은 백만을 넘지 않는다.

www.acmicpc.net

 

2. 사인법칙을 이용한 풀이

 

다음 식을 사인법칙이라고 부른다

 

 

두 점 A,B의 길이를 구하고, 대각 A에 대한 sin값을 구한다.

 

sin값은 어떻게 구해야하나??

 

선택하지 않은 다른 점 C에 대하여 CA, CB 벡터를 구하고 두 벡터의 내적은 길이와 cos의 곱임을 이용해서 cos 값을 구할 수 있다.

 

 

그러면 cos과 sin의 제곱의 합은 1이므로 sin도 구할 수 있다

 

from sys import stdin

pi = 3.141592653589793

while 1:
    
    try:
        x1,y1,x2,y2,x3,y3 = map(float,stdin.readline().split())
        
        #b,a의 길이
        b = (x1-x3,y1-y3)
        b2 = (b[0]**2 + b[1]**2)**(1/2)

        a = (x2-x3,y2-y3)
        a2 = (a[0]**2 + a[1]**2)**(1/2)
        
        #b,a의 내적
        ab = a[0]*b[0] + a[1]*b[1]
        
        #내적의 성질
        cos = ab/(a2*b2)
        
        #cos과 sin의 관계
        sin = (1-(cos**2))**(1/2)
        
        c = ((x2-x1)**2 + (y2-y1)**2)**(1/2)
        
        #sin법칙
        print(f"{pi*c/sin:.2f}")
    
    except:
        break

 

 

사인 법칙 - 나무위키 (namu.wiki)

 

사인 법칙 - 나무위키

사인법칙과 제2코사인법칙을 이용하여 아래 문제를 풀 수 있다. [풀이]세 변의 길이 비가 2k:3k:4k2k:3k:4k2k:3k:4k임을 알 수 있으므로, 제2코사인 법칙에 의해 cos⁡C=(2k)2+(3k)2−(4k)22⋅2k⋅3k=−14 \cos{C}=

namu.wiki

 

 

3. 삼각형의 넓이를 이용한 풀이

 

삼각형의 넓이를 구하는 방법은 매우 많은데...

 

(총정리) 삼각형의 넓이 구하는 공식 (tistory.com)

 

(총정리) 삼각형의 넓이 구하는 공식

(총정리) 삼각형의 넓이 구하는 공식 이 포스팅은 삼각형의 넓이를 구하는 공식과 그 유도과정을 초,중,고 모든 학생을 망라하여 총정리한 글 입니다. 현업에서 수학을 많이 쓰는 사람으로서, 그

color-change.tistory.com

 

 

삼각형의 넓이는 기본적으로 밑변과 높이의 곱이다.

 

 

3-1) 두 변의 길이와 끼인각을 알 때

 

그런데 두 변 a,b의 길이와 사이의 끼인각 C를 알고 있을때, 높이 h는 다음과 같이..

 

 

 

$\frac{h}{b} = sinC$이므로 $h = bsinC$이다.

 

그러므로 삼각형의 넓이 $S = \frac{absinC}{2}$

 

 

3-2) 외접원의 반지름을 알 때

 

그런데 사인법칙에 의하면.. $\frac{c}{sinC} = 2R$이므로 $\frac{c}{2R} = sinC$

 

그러므로 외접원의 반지름을 알고 있을때, 삼각형의 넓이는 다음과 같이 구할 수도 있다.

 

$$S = \frac{abc}{4R}$$

 

 

3-3) 코사인법칙

 

한편 세변의 길이 a,b,c를 알고 있을때..

 

 

코사인 법칙이라고 불리는 다음 식이 성립한다

 

 

 

 

코사인 법칙 - 나무위키 (namu.wiki)

 

코사인 법칙 - 나무위키

비유클리드 기하학에서는 식의 형태가 완전히 달라진다. 제1 코사인 법칙cos⁡a=cos⁡bcos⁡c+sin⁡bsin⁡ccos⁡Acos⁡b=cos⁡acos⁡c+sin⁡asin⁡ccos⁡Bcos⁡c=cos⁡acos⁡b+sin⁡asin⁡bcos⁡C\displaystyle \begin{aligne

namu.wiki

 

 

그러므로 cosB는 다음과 같이 구할 수 있다

 

$$cosB = \frac{c^{2} + a^{2} - b^{2}}{2ca}$$

 

sin과 cos의 제곱의 합은 1이다. 따라서.. sinB는 다음과 같다

 

$$sinB = \sqrt{1 - cosB ^{2}} = \sqrt{1 - (\frac{c^{2} + a^{2} - b^{2}}{2ca})^{2}}$$

 

 

3-4) 헤론의 공식

 

이걸 첫번째 구한 끼인각과 두 변의 길이를 알때 삼각형의 넓이를 구하는 공식에 대입한다면..

 

$$S = \frac{\sqrt{(ac)^{2} - \frac{(c^{2} + a^{2} - b^{2})^{2}}{4}}}{2}$$

 

식을 정리하면..

 

$$S = \sqrt{ \frac{( (a+b+c)(a-b+c) (b+a-c)(b-a+c) )}{16} }$$

 

이제 $s = \frac{(a+b+c)}{2}$라고 하자. 그러면 위 식은 다음과 같이 표현된다

 

$$S = \sqrt{s(s-a)(s-b)(s-c)}$$

 

세 점의 좌표를 알기 때문에 헤론의 공식으로 삼각형의 넓이를 구하고, 이를 abc/4R 공식과 비교하여

 

외접원의 반지름을 구한다면 원주를 구할 수 있다

 

from sys import stdin

pi = 3.141592653589793

while 1:
    
    try:
        x1,y1,x2,y2,x3,y3 = map(float,input().split())

        a = ((x2-x1)**2 + (y2-y1)**2)**(1/2)
        b = ((x3-x2)**2 + (y3-y2)**2)**(1/2)
        c = ((x3-x1)**2 + (y3-y1)**2)**(1/2)

        s = (a+b+c)/2

        #헤론의 공식
        S = (s*(s-a)*(s-b)*(s-c))**(1/2)

        #외접원의 반지름

        R = a*b*c/(4*S)

        print(f"{2*pi*R:.2f}")
    
    except:
        break

 

4. 외접원의 중심의 좌표 구하기

 

세 점을 지나는 원의 중심의 좌표를 바로 구할 수는 없을까?

 

원의 중심의 좌표를 x,y라고 한다면 첫번째 점 (a,b)와 두번째 점 (c,d)까지 거리는 반지름으로 동일하다

 

$$(x-a)^{2} + (y-b)^{2} = (x-c)^{2} + (y-d)^{2}$$

 

식을 정리하면 다음 식을 얻는다

 

$$(2c-2a)x + (2d-2b)y = (c^{2} - a^{2}) + (d^{2} - b^{2})$$

 

마찬가지로 세번째 점 (e,f)까지 거리도 동일하므로...

 

$$(x-e)^{2} + (y-f)^{2} = (x-c)^{2} + (y-d)^{2}$$

 

이 식도 정리하면 다음 식을 얻는다

 

$$(2e-2c)x + (2f-2d)y = (e^{2} - c^{2}) + (f^{2} - d^{2})$$

 

2개의 방정식을 알고 있으므로 연립하면 x,y를 구할 수 있다

 

$$k_{1} = \frac{(c^{2} - a^{2}) + (d^{2} - b^{2})}{2}$$

 

$$k_{2} = \frac{(e^{2} - c^{2}) + (f^{2} - d^{2})}{2}$$

 

라고 표현하자.

 

$$(c-a)x + (d-b)y = k_{1}$$

 

$$(e-c)x + (f-d)y = k_{2}$$

 

(e-c)를 첫번째 곱하고 (c-a)를 두번째 곱해서 두 식을 빼면 y를 구할 수 있고

 

(f-d)를 첫번째 곱하고 (d-b)를 두번째 곱해서 두 식을 빼면 x를 구할 수 있다.

 

그러므로 x,y는 다음과 같다.

 

$$x = \frac{k_{1}(f-d) - k_{2}(d-b)}{(f-d)(c-a) - (d-b)(e-c)}$$

 

$$y = \frac{k_{1}(e-c) - k_{2}(c-a)}{(e-c)(d-b) - (c-a)(f-d)}$$

 

중심의 좌표를 알고 있으므로 (a,b)까지 거리가 반지름이 될 것이고 이를 이용해 원주를 구할 수 있다.

 

from sys import stdin

while 1:
    
    try:

        a,b,c,d,e,f = map(float,stdin.readline().split())

        k1 = (c**2 - a**2 + d**2 - b**2)/2
        k2 = (e**2 - c**2 + f**2 - d**2)/2

        x = (k1*(f-d)-k2*(d-b))/((f-d)*(c-a) - (d-b)*(e-c))

        y = (k1*(e-c)-k2*(c-a))/((e-c)*(d-b) - (c-a)*(f-d))


        pi = 3.141592653589793

        circumference = 2*pi*(((x-a)**2+(y-b)**2)**(1/2))

        print(f"{circumference:.2f}")
    
    except:
        
        break

 

 

TAGS.

Comments