SVG пирог с рубином - PullRequest
       4

SVG пирог с рубином

0 голосов
/ 05 декабря 2010

Я попытался создать небольшой блок кода, который бы создал для меня SVG-диаграмму, перечисленную ниже:

# piechart-svg.rb:
BEGIN {
  @colors = []
  both = %w(coral grey green salmon blue seagreen slategrey cyan)
  darks = %w(magenta red olivegreen orange turquoise goldenrod khaki orchid slateblue violet)
  lights = %w(steelblue yellow skyblue pink goldenrodyellow)
  @colors << both.map {|c| [c, "light#{c}", "dark#{c}"] }
  @colors << darks.map {|c| [c, "dark#{c}"] }
  @colors << lights.map {|c| [c, "light#{c}"] }
  @colors.flatten!

  @radius = 100.0
  @prevcoord = "#{@radius},0"
  puts <<-EOF
<?xml version="1.0" standalone="no" ?>
<svg xmlns="http://www.w3.org/2000/svg"
  preserveAspectRatio="xMinYMin"
  viewBox="-#{@radius},-#{@radius} #{@radius*2},#{@radius*2}">
  <defs>
    <style>
      .wedge { stroke: darkgrey; stroke-linejoin: round; fill-opacity: .2; }
    </style>
  </defs>
  EOF
}

ARGV.each_with_index do |percent,index|
  print "  <path class=\"wedge\" fill=\"#{@colors[index]}\" d=\""
  angle_as_degrees = percent.to_f / 100 * 360
  x = Math::cos(angle_as_degrees * 180 / Math::PI) * @radius
  y = Math::sin(angle_as_degrees * 180 / Math::PI) * @radius
  print "M#{@prevcoord} A#{@radius},#{@radius} 0 0,1 #{x},#{y} L0,0 Z\" />\n"
  @prevcoord = "#{x},#{y}"
end

END { puts "  <circle fill=\"none\" stroke=\"black\" r=\"#{@radius}\" />
</svg>" }

Беда в том, что если я накормлю его, скажем, на 50% (ruby piechart-svg.rb 50), получаемый клин будет меньше половины круга. Я не понимаю почему.

1 Ответ

1 голос
/ 05 декабря 2010

Вы переводите градусы в радианы в обратном направлении. Должно быть:

x = Math::cos(angle_as_degrees * Math::PI / 180) * @radius
y = Math::sin(angle_as_degrees * Math::PI / 180) * @radius

Обратите внимание, что у вас все еще есть проблемы, если какой-либо срез превышает 50%, но это отдельный вопрос. :)

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