用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

我在用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”

我看到您正在调用
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)