Обработка решения треугольников в Ruby - PullRequest
2 голосов
/ 22 декабря 2011

Как лучше всего построить программу на 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

По сути, я в конечном итоге получаю список всех возможных способов ее решения, перебираю их и беру первыйтот, который разрешим.Затем повторите цикл и сделайте второй удар, пока решения не будут найдены.Но это совсем не СУХОЙ.

Как бы вы напали на это?

1 Ответ

1 голос
/ 22 декабря 2011

Хорошо, вот более полное решение - без зацикливания:

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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...