====== Heights ======
===== 풀이 =====
* ha를 높이로 하도록 삼각형을 돌렸을때 밑변의 길이가 a라고 하자. 삼각형의 넓이는 a*ha/2이다.
* 마찬가지로 계산하면 a*ha/2 = b*hb/2 = c*hc/2 이므로, 세 변의 길이의 비 a:b:c = hb*hc:hc*ha:ha*hb 가 된다.
* 세변의 길이가 hb*hc, hc*ha, ha*hb 인 삼각형의 넓이가 S' 이고 이 때의 수선의 길이가 ha' 이라면, 실제 삼각형과의 닮음비는 ha / ha' 가 되므로, 실제 삼각형의 넓이 S = S'*(ha / ha')^2 이 된다
* 세변의 길이가 hb*hc, hc*ha, ha*hb 인 삼각형을 좌표에 그리면, 삼각형의 넓이 S'과 수선의 길이가 ha'를 [[ps:tutorial:다각형#다각형의 면적]]과 [[ps:tutorial:벡터#점과 직선과의 거리]]을 이용해서 구할수 있다. 총 시간복잡도는 O(1)
* 논증기하를 사용해서 좀더 간단히 풀 수도 있다. 삼각형의 넓이는 [[ps:tutorial:논증기하#헤론 공식]]을 사용해서 바로 구할수 있고, 수선의 길이도 {넓이}*2/{밑변} 으로 바로 구할 수 있다.
===== 코드 =====
==== 코드 1 ====
"""Solution code for "BOJ 17236. Heights".
- Problem link: https://www.acmicpc.net/problem/17236
- Solution link: http://www.teferi.net/ps/problems/boj/17236
Tags: [geometry]
"""
from teflib import geometry
def main():
ha = float(input())
hb = float(input())
hc = float(input())
A, B, C = geometry.triangle_from_sides(hb * hc, hc * ha, ha * hb)
BC = (C[0] - B[0], C[1] - B[1])
area_t = geometry.twice_of_polygon_area([A, B, C]) / 2
ha_t = geometry.point_line_distance(*A, *B, *BC)
answer = area_t * (ha / ha_t) ** 2
print(answer)
if __name__ == '__main__':
main()
* Dependency
* [[:ps:teflib:geometry#triangle_from_sides|teflib.geometry.triangle_from_sides]]
* [[:ps:teflib:geometry#twice_of_polygon_area|teflib.geometry.twice_of_polygon_area]]
* [[:ps:teflib:geometry#point_line_distance|teflib.geometry.point_line_distance]]
==== 코드 2 ====
"""Solution code for "BOJ 17236. Heights".
- Problem link: https://www.acmicpc.net/problem/17236
- Solution link: http://www.teferi.net/ps/problems/boj/17236
Tags: [geometry]
"""
import math
def main():
ha = float(input())
hb = float(input())
hc = float(input())
a, b, c = hb * hc, hc * ha, ha * hb
s = (a + b + c) * 0.5
area_t = math.sqrt(s * (s - a) * (s - b) * (s - c))
ha_t = area_t * 2 / a
answer = area_t * (ha / ha_t) ** 2
print(answer)
if __name__ == '__main__':
main()
{{tag>BOJ ps:problems:boj:골드_4}}