在scala中绘制形状

时间:2011-10-10 04:32:27

标签: scala composite shapes

我在使用scala语言实现绘制时遇到了一些严重的麻烦。我目前的代码如下:

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)
   )
  )

复杂的事情继续失败,我无法弄清楚原因。

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

import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import org.scalatest.FunSuite

import java.awt.image.BufferedImage

import TestFixtures._

@RunWith(classOf[JUnitRunner])
class TestDraw extends FunSuite with BufferedImageEquality {
  test("simple") {
    val s = simpleLocation
    val i = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB)
    Draw(i.createGraphics())(s)
    val j = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB)
    val g = j.createGraphics()
    g.translate(70, 30)
    g.drawRect(0, 0, 80, 120)
    assertEquals(i, j)
  }
  test("complex") {
    val s = complexGroup
    val i = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB)
    Draw(i.createGraphics())(s)
    val j = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB)
    val g = j.createGraphics()
    paintComplexGroup(g)
        assertEquals(i, j)
  }
}

测试用例如上所示。我从单元测试的结果得到“0不等于255”。

2 个答案:

答案 0 :(得分:2)

如果你看看translate做了什么,Javadoc说

  

“将Graphics2D上下文的原点转换为点(x,y)   在当前坐标系中。“

所以

  g.translate(0,0)

什么都不做。尝试

  g.translate(-x, -y)

虽然,如果是我,我不会搞乱Graphics对象的起源。我会修改drawRectdrawArc语句以获取位置,并将位置co-ordiates作为参数传递给方法。

答案 1 :(得分:1)

我看到你在translate上调用g: Graphics2D,它会改变该对象。但是,在完成绘制翻译对象后,您不会撤消该突变。此外,还有一个问题是你是否希望翻译是累积的(例如,第二个翻译是绝对的200,150,而不是绝对的150,50)。

这可能是你看到的问题吗?