在Ruby中构建程序的最佳方法是什么,它可以解决不同类型的三角形:特别是AAS,ASA,SAS,SSA和SSS三角形。
只有三种不同的解决方案:使用正弦定律,余弦定律和所有角度加起来为180.
我一直在玩这个不同的实现,但我找不到一个很好的干净方法来使这个很好和干。
我现在正在做这样的事情:
def solve
#AA
!self.A && self.B && self.C ? self.A = 180 - (self.B + self.C) : false
!self.B && self.A && self.C ? self.B = 180 - (self.A + self.C) : false
!self.C && self.B && self.A ? self.C = 180 - (self.B + self.A) : false
#AAS
!self.a && self.A && self.C && self.c ? self.a = (self.c * Math.sin(self.A.degrees))/Math.sin(self.C.degrees) : false
!self.b && self.B && self.C && self.c ? self.b = (self.c * Math.sin(self.B.degrees))/Math.sin(self.C.degrees) : false
end
基本上我最终要做的就是列出所有可能的方法来解决它,循环遍历它们并抓住第一个可解决的方法。然后再次循环并再次刺入它直到找不到解决方案。但它根本不是DRY。
你会怎么攻击这个?
答案 0 :(得分:1)
好的,这是一个更完整的解决方案 - 但没有循环:
class Triangle
def initialize( options )
@angles = [options[:alpha], options[:beta], options[:gamma]]
@sides = [options[:a], options[:b], options[:c]]
end
def solve
# AA
if @angles.one?( &:nil? )
@angles[@angles.index( nil )] = 180 - @angles.compact.inject( &:+ )
end
# AAS
(0..2).each do |i|
if !@sides[i] && @angles[i]
(0..2).each do |j|
if @angles[j] && @sides[j]
@sides[i] = ( @sides[j] * Math.sin( @angles[i] ).abs ) / Math.sin( @angles[j] ).abs
end
end
end
end
# ...
puts @angles.to_s
puts @sides.to_s
end
end
t = Triangle.new:alpha => 62,:beta => 35,:a => 7
t.solve
[62,35,83]
[7,4.054866015928188,9.170357476093628]