我在使用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”。
答案 0 :(得分:2)
如果你看看translate
做了什么,Javadoc说
“将Graphics2D上下文的原点转换为点(x,y) 在当前坐标系中。“
所以
g.translate(0,0)
什么都不做。尝试
g.translate(-x, -y)
虽然,如果是我,我不会搞乱Graphics对象的起源。我会修改drawRect
和drawArc
语句以获取位置,并将位置co-ordiates作为参数传递给方法。
答案 1 :(得分:1)
我看到你在translate
上调用g: Graphics2D
,它会改变该对象。但是,在完成绘制翻译对象后,您不会撤消该突变。此外,还有一个问题是你是否希望翻译是累积的(例如,第二个翻译是绝对的200,150,而不是绝对的150,50)。
这可能是你看到的问题吗?