Рисование фигур в скале - PullRequest
1 голос
/ 10 октября 2011

У меня серьезные проблемы с реализацией ничьей на языке скала.мой текущий код выглядит следующим образом:

package edu.luc.cs.laufer.cs473.shapealgebra

import java.awt.Graphics2D

class Draw {
  def draw(g: Graphics2D)(s: Shape): Unit = s match {
    case Ellipse(hw, hh) => g.drawArc(-hw, -hh, 2 * hw, 2 * hh, 0, 360)
    case Rectangle(w, h) => g.drawRect(0, 0, w, h)
    case Location(x: Int, y: Int, shape: Shape) => {
      g.translate(x, y)
      draw(g)(shape)
      g.translate(0,0)
    }
    case Group(shapes @ _*) => {
      shapes foreach(draw(g)(_))
    }
  }
 }

 object Draw extends Draw {
  def apply(g: Graphics2D) = draw(g)(_)
}

Проблема здесь в случае моей группы.Он не рисует группу фигур правильно.В двух тестовых случаях используются следующие формы:

val simpleLocation = Location(70, 30, Rectangle(80, 120))
val complexGroup = Location(50, 100,
    Group(
     Ellipse(20, 20),
     Location(150, 50,
        Group(
          Rectangle(50, 30),
          Rectangle(300, 60),
          Location(100, 200,
          Ellipse(50, 50)
         )
       )
     ),
     Rectangle(100, 200)
   )
  )

Комплекс продолжает давать сбой, и я не могу понять, почему.Я получаю «0 не равно 255» из результата модульного теста.

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Если вы посмотрите на то, что делает translate, Javadoc говорит

"Переводит начало контекста Graphics2D в точку (x, y) в текущей системе координат. "

So

  g.translate(0,0)

ничего не делает. Попробуйте

  g.translate(-x, -y)

Хотя, если бы это был я, я бы не связывался с происхождением объекта Graphics. Я бы изменил операторы drawRect и drawArc, чтобы они занимали местоположение, и передавал координаты местоположения как аргумент методу.

1 голос
/ 10 октября 2011

Я вижу, вы звоните translate на g: Graphics2D, который изменяет этот объект.Однако вы не отмените эту мутацию, как только закончите рисовать переведенные объекты.Кроме того, также возникает вопрос, ожидаете ли вы, что перевод будет кумулятивным (например, второй перевод будет абсолютным 200, 150 вместо абсолютных 150, 50).1005 *

...