Friday, October 16, 2015

Visualize Bezier curve in Scala

Here is the code:

import org.jfree.chart._
import org.jfree.data.xy._

object Main {

  val t: Array[Double] = (0 until 1000).map(_ * 0.001).toArray
  val x0 = 4.0
  val y0 = 1.0
  val x1 = 28.0
  val y1 = 48.0
  val x2 = 50.0
  val y2 = 42.0
  val x3 = 40.0
  val y3 = 5.0
  val termsZipped: Array[(((Double, Double), Double), Double)] = term(t, 0, 3).zip(term(t, 1, 2)).zip(term(t, 2, 1)).zip(term(t, 3, 0))
  val xCoordinates = termsZipped.map {
    case (((t0, t1), t2), t3) => x0 * t0 + 3 * x1 * t1 + 3 * x2 * t2 + x3 * t3
  }
  val yCoordinates = termsZipped.map {
    case (((t0, t1), t2), t3) => y0 * t0 + 3 * y1 * t1 + 3 * y2 * t2 + y3 * t3
  }
  // add control points
  val xCoordinatesAll = Array(x1, x0) ++ xCoordinates ++ Array(x3, x2)
  val yCoordinatesAll = Array(y1, y0) ++ yCoordinates ++ Array(y3, y2)

  // t^0 * (1 - t)^3
  // t^1 * (1 - t)^2
  // etc
  def term(a: Array[Double], coef1: Double, coef2: Double): Array[Double] = {
    a.map((x: Double) => Math.pow(x, coef1) * Math.pow(1 - x, coef2))
  }

  def main(args: Array[String]) {
    val dataset = new DefaultXYDataset
    dataset.addSeries("S", Array(xCoordinatesAll, yCoordinatesAll))
    val frame = new ChartFrame(
      "Title",
      ChartFactory.createXYLineChart(
        "Plot",
        "X", "Y", dataset,
        org.jfree.chart.plot.PlotOrientation.VERTICAL,
        false, false, false
      )
    )
    frame.pack()
    frame.setVisible(true)
  }
}

0 comments: