用scala绘制图形
我在用scala语言实现绘图时遇到了一些严重的问题。我当前的代码如下所示:用scala绘制图形,scala,composite,shapes,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, 3
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” 我看到您正在调用
g:Graphics2D
上的translate
,这会使该对象发生变异。但是,一旦绘制完转换的对象,就不能撤消该突变。此外,还有一个问题是,你是否期望翻译是累积的(例如,第二次翻译是绝对的200,150,而不是绝对的150,50)
这可能就是你看到的问题吗?如果你看看
翻译的功能,Javadoc说
将Graphics2D上下文的原点转换为点(x,y)
在当前坐标系中。”
所以
什么也不做。试一试
g.translate(-x, -y)
虽然,如果是我,我不会弄乱图形对象的原点。我会修改drawRect
和drawArc
语句以获取一个位置,并将位置坐标作为参数传递给该方法。我们缺少椭圆、矩形和位置的实现,因此我们看不到问题所在,你也没有描述到底出了什么问题。这并没有真正改善问题。我们不知道paintComplexGroup做什么(不确切),我们仍然不能自己尝试,因为我们缺少一些类的定义。你是说翻译而不是转换?我试图通过更改代码来解决你提出的第一个问题,正如你在上面看到的那样。我仍然从单元测试中得到相同的结果。还有,我真的不明白你的第二点。你能澄清一下吗?@Luigi为我辩护,已经很晚了。:-)@马修,你有一个位置在另一个里面。第一个位置将转换为50100。第二个是150,50。但这是相对于50100的150,50(即,绝对150+50,50+100),还是不是?我甚至不知道Graphics2D
能做什么,更不用说它能做什么是你所期望的了。根据你的定义,我相信我会说位置是绝对的。而不是位置的总和
g.translate(-x, -y)