Ruby

三角形の周囲長と面積

以下のように、配列を使って平面上に3点の座標が定義されています。この三点で構成される三角形の辺の長さの合計と面積を求めるプログラムを作成してください。

pts = [[0,0],[3,4],[3,0]]

上記の点はXY軸にそれぞれ垂直な二辺を持っていますが、下記のような座標が与えられても正しく計算できるように作成してください。

pts = [[0,0],[2,4],[4,2]]

解答例 ピタゴラスの定義「直角三角形の斜辺の長さを c、他の2辺の長さを a, b とすると、a^2 + b^2 = c^2 が成り立つ(『^』はべき乗の意)」を使います。対象となる三角形は直角三角形であるとは限らないため、下図のように補助線を引いて考えます。三点に外接する矩形を書くと、対象三角形の周囲に3つの直角三角形が現れます。

これらを使って周囲長と面積を求めるプログラムが以下のようになります。

#pts = [[0,0],[3,4],[3,0]]
pts = [[0,0],[2,4],[4,2]]

# 2点間の距離を返す関数
def length(p1,p2)
  dx = (p1[0] - p2[0]).to_f
  dy = (p1[1] - p2[1]).to_f
  Math.sqrt(dx ** 2 + dy ** 2)
end

# 2点を斜辺とする直角三角形の面積を返す関数
def area(p1,p2)
  dx = (p1[0] - p2[0]).abs.to_f
  dy = (p1[1] - p2[1]).abs.to_f
  dx * dy / 2
end

# 複数の点が外接する矩形の面積を返す関数
def area_of_square(pts)
  xs = pts.map { |e| e[0] }
  ys = pts.map { |e| e[1] }
  (xs.max - xs.min) * (ys.max - ys.min)
end

l1 = length(pts[0],pts[1])
l2 = length(pts[1],pts[2])
l3 = length(pts[2],pts[0])

as = area_of_square(pts)
a1 = area(pts[0],pts[1])
a2 = area(pts[1],pts[2])
a3 = area(pts[2],pts[0])

puts "Length: %f" % [l1 + l2 + l3]
puts "Area: %f" % [as - (a1 + a2 + a3)]

参考URL