Ваша основная проблема с этой частью кода: new Rectangle2D.Double(d*30.0, e*30.0...
- первый аргумент - x
координата, поэтому его следует умножить на map
значение столбца, а не на строку, и то же самое на второй аргумент e*30
, который y
так что надо умножить на map
значение строки.
Я реорганизовал ваш код для лучшего понимания, по крайней мере для себя, поэтому, пожалуйста, посмотрите в качестве примера:
import java.awt.image.BufferedImage
import java.awt.{Color, Rectangle, RenderingHints}
import javax.imageio.ImageIO
import scala.reflect.ClassTag
/**
* Immutable table model, possibly empty inside
*/
class Table[T](underlying: Array[Array[T]]) {
def columnsCount: Int = underlying.headOption.map(_.length).getOrElse(0)
def rowsCount: Int = underlying.length
def rows: Seq[Int] = underlying.indices
def columns: Seq[Int] = underlying.headOption.map(_.indices).getOrElse(Nil)
def apply(row: Int, column: Int): Option[T] = {
val rowExists = row < rowsCount && row >= 0
val columnExists = column < columnsCount && column >= 0
if(rowExists && columnExists) Some(underlying(row)(column)) else None
}
def update(row: Int, column: Int, value: T): Table[T] = {
val copy = underlying.clone()
copy(row)(column) = value
new Table[T](copy)
}
def foreach[U](f: ((Int, Int, T)) => U): Unit = {
val rowColumnValue = for {
row <- rows
column <- columns
value <- apply(row, column)
} yield (row, column, value)
rowColumnValue.foreach[U](f)
}
override def toString: String = underlying.map(_.mkString(",")).mkString("\n")
}
object Table {
def apply[T: ClassTag](rows: Int, columns: Int, initValue: T): Table[T] = {
new Table[T](Array.fill(rows, columns)(initValue))
}
}
class Draw(cellSize: Int) {
def draw(table: Table[Int]) {
val width = cellSize * table.columnsCount
val height = cellSize * table.rowsCount
val canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
val graphics = canvas.createGraphics()
graphics.setColor(Color.WHITE)
graphics.fillRect(0, 0, canvas.getWidth, canvas.getHeight)
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
table.foreach { case (row, column, value) =>
if (value == 2) {
graphics.setColor(Color.BLUE)
// This is main fix part
val x = column * cellSize
val y = row * cellSize
graphics.fill(new Rectangle(x, y, cellSize, cellSize))
}
}
graphics.dispose()
ImageIO.write(canvas, "png", new java.io.File("island_drawing.png"))
}
}
object DrawApp {
def main(args: Array[String]): Unit = {
val draw = new Draw(30)
val table = Table(5, 10, 2)
.update(4 ,9, 5)
.update(4, 8, 5)
.update(3, 9, 5)
.update(3, 8, 5)
println(table)
draw.draw(table)
}
}
Это произвело ожидаемое изображение. Надеюсь, это поможет!