<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F2D_Graphics_GUI%2FCurve</id>
		<title>Java/2D Graphics GUI/Curve - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F2D_Graphics_GUI%2FCurve"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Curve&amp;action=history"/>
		<updated>2026-04-21T12:52:49Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Curve&amp;diff=8187&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Curve&amp;diff=8187&amp;oldid=prev"/>
				<updated>2010-06-01T06:56:09Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:56, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Curve&amp;diff=8186&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Curve&amp;diff=8186&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:46Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A spline factory instance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
/*&lt;br /&gt;
 * This code is free software; you can redistribute it and/or&lt;br /&gt;
 * modify it under the terms of the GNU Lesser General Public &lt;br /&gt;
 * License as published by the Free Software Foundation; either &lt;br /&gt;
 * version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This code is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 * GNU Lesser General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU Lesser General Public &lt;br /&gt;
 * License along with this program; if not, write to the Free &lt;br /&gt;
 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, &lt;br /&gt;
 * MA  02111-1307, USA.&lt;br /&gt;
 */&lt;br /&gt;
//package no.geosoft.cc.geometry.spline;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A spline factory instance.&lt;br /&gt;
 * &lt;br /&gt;
 * @author &lt;br /&gt;
 */   &lt;br /&gt;
class CatmullRomSpline extends CubicSpline&lt;br /&gt;
{&lt;br /&gt;
  /**&lt;br /&gt;
   * Construct a Catmull-Rom spline. Package local; Use the SplineFactory&lt;br /&gt;
   * to create splines of this type. The control points are used according&lt;br /&gt;
   * to the definition of Catmull-Rom splines.&lt;br /&gt;
   * &lt;br /&gt;
   * @param controlPoints  Control points of spline (x0,y0,z0,x1,y1,z1,...)&lt;br /&gt;
   * @param nParts         Number of parts in generated spline.&lt;br /&gt;
   */&lt;br /&gt;
  CatmullRomSpline (double controlPoints[], int nParts)&lt;br /&gt;
  {&lt;br /&gt;
    super (controlPoints, nParts);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  protected void initialize (double controlPoints[], int nParts)&lt;br /&gt;
  {&lt;br /&gt;
    nParts_ = nParts;&lt;br /&gt;
    // Endpoints are added twice to force in the generated array&lt;br /&gt;
    controlPoints_ = new double[controlPoints.length + 6];&lt;br /&gt;
    System.arraycopy (controlPoints, 0, controlPoints_, 3,&lt;br /&gt;
                      controlPoints.length);&lt;br /&gt;
    &lt;br /&gt;
    controlPoints_[0] = controlPoints_[3];&lt;br /&gt;
    controlPoints_[1] = controlPoints_[4];&lt;br /&gt;
    controlPoints_[2] = controlPoints_[5];&lt;br /&gt;
    &lt;br /&gt;
    controlPoints_[controlPoints_.length - 3] = controlPoints_[controlPoints_.length - 6];&lt;br /&gt;
    controlPoints_[controlPoints_.length - 2] = controlPoints_[controlPoints_.length - 5];&lt;br /&gt;
    controlPoints_[controlPoints_.length - 1] = controlPoints_[controlPoints_.length - 4];&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  protected double blend (int i, double t)&lt;br /&gt;
  {&lt;br /&gt;
    if      (i == -2) return ((-t + 2) * t - 1) * t / 2;&lt;br /&gt;
    else if (i == -1) return (((3 * t - 5) * t) * t + 2) / 2;&lt;br /&gt;
    else if (i ==  0) return ((-3 * t + 4) * t + 1) * t / 2;&lt;br /&gt;
    else              return ((t - 1) * t * t) / 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Curve with QuadCurve2D ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import java.awt.Canvas;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Graphics2D;&lt;br /&gt;
import java.awt.geom.QuadCurve2D;&lt;br /&gt;
import java.awt.geom.Rectangle2D;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import javax.swing.JApplet;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
public class QuadCurve extends JApplet {&lt;br /&gt;
  DrawingCanvas canvas;&lt;br /&gt;
  public static void main(String[] a){&lt;br /&gt;
      JFrame f = new JFrame();&lt;br /&gt;
      QuadCurve curve = new QuadCurve();&lt;br /&gt;
      curve.init();&lt;br /&gt;
      f.getContentPane().add(curve);&lt;br /&gt;
      f.setDefaultCloseOperation(1);&lt;br /&gt;
      f.setSize(650,250);&lt;br /&gt;
      f.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void init() {&lt;br /&gt;
    Container container = getContentPane();&lt;br /&gt;
    canvas = new DrawingCanvas();&lt;br /&gt;
    container.add(canvas);&lt;br /&gt;
  }&lt;br /&gt;
  class DrawingCanvas extends Canvas {&lt;br /&gt;
    Vector quadCurves;&lt;br /&gt;
    QuadCurve2D selectedCurve = null;&lt;br /&gt;
    Rectangle2D boundingRec = null;&lt;br /&gt;
    public DrawingCanvas() {&lt;br /&gt;
      setBackground(Color.white);&lt;br /&gt;
      setSize(400, 200); // width and height of canvas&lt;br /&gt;
      quadCurves = new Vector();&lt;br /&gt;
      quadCurves.addElement(new QuadCurve2D.Float(20, 20, 80, 160, 120,&lt;br /&gt;
          20));&lt;br /&gt;
      quadCurves.addElement(new QuadCurve2D.Float(120, 100, 160, 40, 200,&lt;br /&gt;
          180));&lt;br /&gt;
      quadCurves.addElement(new QuadCurve2D.Float(240, 20, 220, 60, 260,&lt;br /&gt;
          120));&lt;br /&gt;
      quadCurves.addElement(new QuadCurve2D.Float(250, 160, 260, 140,&lt;br /&gt;
          280, 180));&lt;br /&gt;
      quadCurves.addElement(new QuadCurve2D.Float(300, 180, 340, 40, 380,&lt;br /&gt;
          120));&lt;br /&gt;
      quadCurves.addElement(new QuadCurve2D.Float(20, 180, 80, 170, 120,&lt;br /&gt;
          190));&lt;br /&gt;
    }&lt;br /&gt;
    public void paint(Graphics g) {&lt;br /&gt;
      Graphics2D g2D = (Graphics2D) g;&lt;br /&gt;
      for (int i = 0; i &amp;lt; quadCurves.size(); i++) {&lt;br /&gt;
        g2D.draw((QuadCurve2D) quadCurves.elementAt(i));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Draw curve with mouse ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import java.awt.BasicStroke;&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Canvas;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Graphics2D;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.event.MouseAdapter;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.event.MouseMotionListener;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.awt.geom.CubicCurve2D;&lt;br /&gt;
import java.awt.geom.Line2D;&lt;br /&gt;
import java.awt.geom.QuadCurve2D;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
public class CubicCurveMouse extends JFrame {&lt;br /&gt;
  DrawingCanvas canvas;&lt;br /&gt;
  JLabel label = new JLabel(&amp;quot;Mouse Location (x, y):  &amp;quot;); &lt;br /&gt;
  JLabel coords = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
  public CubicCurveMouse() {&lt;br /&gt;
    super();&lt;br /&gt;
    Container container = getContentPane();&lt;br /&gt;
    JPanel panel = new JPanel();&lt;br /&gt;
    panel.setLayout(new GridLayout(1, 2));&lt;br /&gt;
    &lt;br /&gt;
    panel.add(label);&lt;br /&gt;
    panel.add(label);&lt;br /&gt;
    panel.add(coords);&lt;br /&gt;
    container.add(panel, BorderLayout.SOUTH);&lt;br /&gt;
    canvas = new DrawingCanvas();&lt;br /&gt;
    container.add(canvas);&lt;br /&gt;
    addWindowListener(new WindowEventHandler());&lt;br /&gt;
        setSize(300,300);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  class WindowEventHandler extends WindowAdapter {&lt;br /&gt;
    public void windowClosing(WindowEvent e) {&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String arg[]) {&lt;br /&gt;
    new CubicCurveMouse();&lt;br /&gt;
  }&lt;br /&gt;
  class DrawingCanvas extends Canvas {&lt;br /&gt;
    float x1, y1, xc1cur, yc1cur, xc1new, yc1new, xc2cur, yc2cur, xc2new,&lt;br /&gt;
        yc2new, x4cur, y4cur, x4new, y4new;&lt;br /&gt;
    int pressNo = 0;&lt;br /&gt;
    int dragFlag1 = -1;&lt;br /&gt;
    int dragFlag2 = -1;&lt;br /&gt;
    boolean clearFlag = false;&lt;br /&gt;
    float dashes[] = { 5f, 5f };&lt;br /&gt;
    BasicStroke stroke;&lt;br /&gt;
    public DrawingCanvas() {&lt;br /&gt;
      setBackground(Color.white);&lt;br /&gt;
      addMouseListener(new MyMouseListener());&lt;br /&gt;
      addMouseMotionListener(new MyMouseListener());&lt;br /&gt;
      setSize(400, 400);&lt;br /&gt;
      stroke = new BasicStroke(1f, BasicStroke.CAP_BUTT,&lt;br /&gt;
          BasicStroke.JOIN_BEVEL, 10f, dashes, 0f);&lt;br /&gt;
    }&lt;br /&gt;
    public void update(Graphics g) {&lt;br /&gt;
      paint(g);&lt;br /&gt;
    }&lt;br /&gt;
    public void paint(Graphics g) {&lt;br /&gt;
      Graphics2D g2D = (Graphics2D) g;&lt;br /&gt;
      if (pressNo == 1) {&lt;br /&gt;
        g2D.setXORMode(getBackground());&lt;br /&gt;
        g2D.setColor(Color.black);&lt;br /&gt;
        g2D.setStroke(stroke);&lt;br /&gt;
        // Erase the currently existing line&lt;br /&gt;
        g2D.draw(new Line2D.Float(x1, y1, x4cur, y4cur));&lt;br /&gt;
        // Draw the new line&lt;br /&gt;
        g2D.draw(new Line2D.Float(x1, y1, x4new, y4new));&lt;br /&gt;
        // Update the currently existing coordinate values&lt;br /&gt;
        x4cur = x4new;&lt;br /&gt;
        y4cur = y4new;&lt;br /&gt;
      }else if (pressNo == 2) {&lt;br /&gt;
        g2D.setXORMode(getBackground());&lt;br /&gt;
        g2D.setColor(Color.black);&lt;br /&gt;
        g2D.setStroke(stroke);&lt;br /&gt;
        if (dragFlag1 != -1) {&lt;br /&gt;
          g2D.draw(new QuadCurve2D.Float(x1, y1, xc1cur, yc1cur,&lt;br /&gt;
              x4new, y4new));&lt;br /&gt;
        }&lt;br /&gt;
        dragFlag1++; // Reset the drag-flag&lt;br /&gt;
        g2D.draw(new QuadCurve2D.Float(x1, y1, xc1new, yc1new, x4new,&lt;br /&gt;
            y4new));&lt;br /&gt;
        xc1cur = xc1new;&lt;br /&gt;
        yc1cur = yc1new;&lt;br /&gt;
      }else if (pressNo == 3) {&lt;br /&gt;
        g2D.setXORMode(getBackground());&lt;br /&gt;
        g2D.setColor(Color.black);&lt;br /&gt;
        if (dragFlag2 != -1) {&lt;br /&gt;
          g2D.draw(new CubicCurve2D.Float(x1, y1, xc1new, yc1new,&lt;br /&gt;
              xc2cur, yc2cur, x4new, y4new));&lt;br /&gt;
        }&lt;br /&gt;
        dragFlag2++; // Reset the drag flag&lt;br /&gt;
        g2D.draw(new CubicCurve2D.Float(x1, y1, xc1new, yc1new, xc2new,&lt;br /&gt;
            yc2new, x4new, y4new));&lt;br /&gt;
        xc2cur = xc2new;&lt;br /&gt;
        yc2cur = yc2new;&lt;br /&gt;
      }&lt;br /&gt;
      if (clearFlag) {&lt;br /&gt;
        g2D.setXORMode(getBackground());&lt;br /&gt;
        g2D.setColor(Color.black);&lt;br /&gt;
        g2D.setStroke(stroke);&lt;br /&gt;
        g2D.draw(new Line2D.Float(x1, y1, x4new, y4new));&lt;br /&gt;
        g2D.draw(new QuadCurve2D.Float(x1, y1, xc1new, yc1new, x4new,&lt;br /&gt;
            y4new));&lt;br /&gt;
        clearFlag = false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    class MyMouseListener extends MouseAdapter implements MouseMotionListener {&lt;br /&gt;
      public void mousePressed(MouseEvent e) {&lt;br /&gt;
        if (pressNo == 0) { &lt;br /&gt;
          pressNo++;&lt;br /&gt;
          x1 = x4cur = e.getX();&lt;br /&gt;
          y1 = y4cur = e.getY();&lt;br /&gt;
        } else if (pressNo == 1) {&lt;br /&gt;
          pressNo++;&lt;br /&gt;
          xc1cur = e.getX();&lt;br /&gt;
          yc1cur = e.getY();&lt;br /&gt;
        } else if (pressNo == 2) {&lt;br /&gt;
          pressNo++;&lt;br /&gt;
          xc2cur = e.getX();&lt;br /&gt;
          yc2cur = e.getY();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      public void mouseReleased(MouseEvent e) {&lt;br /&gt;
        if (pressNo == 1) {&lt;br /&gt;
          x4new = e.getX();&lt;br /&gt;
          y4new = e.getY();&lt;br /&gt;
          canvas.repaint();&lt;br /&gt;
        } else if (pressNo == 2) {&lt;br /&gt;
          xc1new = e.getX();&lt;br /&gt;
          yc1new = e.getY();&lt;br /&gt;
          canvas.repaint();&lt;br /&gt;
        } else if (pressNo == 3) {&lt;br /&gt;
          xc2new = e.getX();&lt;br /&gt;
          yc2new = e.getY();&lt;br /&gt;
          canvas.repaint();&lt;br /&gt;
          pressNo = 0;&lt;br /&gt;
          dragFlag1 = -1;&lt;br /&gt;
          dragFlag2 = -1;&lt;br /&gt;
          clearFlag = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      public void mouseDragged(MouseEvent e) {&lt;br /&gt;
        if (pressNo == 1) {&lt;br /&gt;
          x4new = e.getX();&lt;br /&gt;
          y4new = e.getY();&lt;br /&gt;
          String string = &amp;quot;(&amp;quot; + Integer.toString(e.getX()) + &amp;quot;, &amp;quot;&lt;br /&gt;
              + Integer.toString(e.getY()) + &amp;quot;)&amp;quot;;&lt;br /&gt;
          coords.setText(string);&lt;br /&gt;
          canvas.repaint();&lt;br /&gt;
        } else if (pressNo == 2) {&lt;br /&gt;
          xc1new = e.getX();&lt;br /&gt;
          yc1new = e.getY();&lt;br /&gt;
          String string = &amp;quot;(&amp;quot; + Integer.toString(e.getX()) + &amp;quot;, &amp;quot;&lt;br /&gt;
              + Integer.toString(e.getY()) + &amp;quot;)&amp;quot;;&lt;br /&gt;
          coords.setText(string);&lt;br /&gt;
          canvas.repaint();&lt;br /&gt;
        } else if (pressNo == 3) {&lt;br /&gt;
          xc2new = e.getX();&lt;br /&gt;
          yc2new = e.getY();&lt;br /&gt;
          String string = &amp;quot;(&amp;quot; + Integer.toString(e.getX()) + &amp;quot;, &amp;quot;&lt;br /&gt;
              + Integer.toString(e.getY()) + &amp;quot;)&amp;quot;;&lt;br /&gt;
          coords.setText(string);&lt;br /&gt;
          canvas.repaint();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      public void mouseMoved(MouseEvent e) {&lt;br /&gt;
        String string = &amp;quot;(&amp;quot; + Integer.toString(e.getX()) + &amp;quot;, &amp;quot;&lt;br /&gt;
            + Integer.toString(e.getY()) + &amp;quot;)&amp;quot;;&lt;br /&gt;
        coords.setText(string);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interpolates given points by a bezier curve ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;   &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 2005 David Benson&lt;br /&gt;
 *  &lt;br /&gt;
 * See LICENSE file in distribution for licensing details of this source file&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.Point;&lt;br /&gt;
import java.awt.geom.Point2D;&lt;br /&gt;
/**&lt;br /&gt;
 * Interpolates given points by a bezier curve. The first&lt;br /&gt;
 * and the last two points are interpolated by a quadratic&lt;br /&gt;
 * bezier curve; the other points by a cubic bezier curve.&lt;br /&gt;
 * &lt;br /&gt;
 * Let p a list of given points and b the calculated bezier points,&lt;br /&gt;
 * then one get the whole curve by:&lt;br /&gt;
 * &lt;br /&gt;
 * sharedPath.moveTo(p[0])&lt;br /&gt;
 * sharedPath.quadTo(b[0].x, b[0].getY(), p[1].x, p[1].getY());&lt;br /&gt;
 * &lt;br /&gt;
 * for(int i = 2; i &amp;lt; p.length - 1; i++ ) {&lt;br /&gt;
 *    Point b0 = b[2*i-3];&lt;br /&gt;
 *    Point b1 = b[2*i-2];&lt;br /&gt;
 *    sharedPath.curveTo(b0.x, b0.getY(), b1.x, b1.getY(), p[i].x, p[i].getY());&lt;br /&gt;
 * }&lt;br /&gt;
 * &lt;br /&gt;
 * sharedPath.quadTo(b[b.length-1].x, b[b.length-1].getY(), p[n - 1].x, p[n - 1].getY());&lt;br /&gt;
 * &lt;br /&gt;
 * @author krueger&lt;br /&gt;
 */&lt;br /&gt;
public class Bezier {&lt;br /&gt;
  private static final float AP = 0.5f;&lt;br /&gt;
  private Point2D[] bPoints;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new Bezier curve.&lt;br /&gt;
   * @param points&lt;br /&gt;
   */&lt;br /&gt;
  public Bezier(Point2D[] points) {&lt;br /&gt;
    int n = points.length;&lt;br /&gt;
    if (n &amp;lt; 3) {&lt;br /&gt;
      // Cannot create bezier with less than 3 points&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    bPoints = new Point[2 * (n - 2)];&lt;br /&gt;
    double paX, paY;&lt;br /&gt;
    double pbX = points[0].getX();&lt;br /&gt;
    double pbY = points[0].getY();&lt;br /&gt;
    double pcX = points[1].getX();&lt;br /&gt;
    double pcY = points[1].getY();&lt;br /&gt;
    for (int i = 0; i &amp;lt; n - 2; i++) {&lt;br /&gt;
      paX = pbX;&lt;br /&gt;
      paY = pbY;&lt;br /&gt;
      pbX = pcX;&lt;br /&gt;
      pbY = pcY;&lt;br /&gt;
      pcX = points[i + 2].getX();&lt;br /&gt;
      pcY = points[i + 2].getY();&lt;br /&gt;
      double abX = pbX - paX;&lt;br /&gt;
      double abY = pbY - paY;&lt;br /&gt;
      double acX = pcX - paX;&lt;br /&gt;
      double acY = pcY - paY;&lt;br /&gt;
      double lac = Math.sqrt(acX * acX + acY * acY);&lt;br /&gt;
      acX = acX /lac;&lt;br /&gt;
      acY = acY /lac;&lt;br /&gt;
      double proj = abX * acX + abY * acY;&lt;br /&gt;
      proj = proj &amp;lt; 0 ? -proj : proj;&lt;br /&gt;
      double apX = proj * acX;&lt;br /&gt;
      double apY = proj * acY;&lt;br /&gt;
      double p1X = pbX - AP * apX;&lt;br /&gt;
      double p1Y = pbY - AP * apY;&lt;br /&gt;
      bPoints[2 * i] = new Point((int) p1X, (int) p1Y);&lt;br /&gt;
      acX = -acX;&lt;br /&gt;
      acY = -acY;&lt;br /&gt;
      double cbX = pbX - pcX;&lt;br /&gt;
      double cbY = pbY - pcY;&lt;br /&gt;
      proj = cbX * acX + cbY * acY;&lt;br /&gt;
      proj = proj &amp;lt; 0 ? -proj : proj;&lt;br /&gt;
      apX = proj * acX;&lt;br /&gt;
      apY = proj * acY;&lt;br /&gt;
      double p2X = pbX - AP * apX;&lt;br /&gt;
      double p2Y = pbY - AP * apY;&lt;br /&gt;
      bPoints[2 * i + 1] = new Point((int) p2X, (int) p2Y);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the calculated bezier points.&lt;br /&gt;
   * @return the calculated bezier points&lt;br /&gt;
   */&lt;br /&gt;
  public Point2D[] getPoints() {&lt;br /&gt;
    return bPoints;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the number of bezier points.&lt;br /&gt;
   * @return number of bezier points&lt;br /&gt;
   */&lt;br /&gt;
  public int getPointCount() {&lt;br /&gt;
    return bPoints.length;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the bezier points at position i.&lt;br /&gt;
   * @param i&lt;br /&gt;
   * @return the bezier point at position i&lt;br /&gt;
   */&lt;br /&gt;
  public Point2D getPoint(int i) {&lt;br /&gt;
    return bPoints[i];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Move the curve control point and redraw the curve ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Graphics2D;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.geom.CubicCurve2D;&lt;br /&gt;
import java.awt.geom.Ellipse2D;&lt;br /&gt;
import java.awt.geom.Line2D;&lt;br /&gt;
import java.awt.geom.Point2D;&lt;br /&gt;
import java.awt.geom.QuadCurve2D;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.event.MouseInputAdapter;&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void main(String[] args){&lt;br /&gt;
    JFrame frame = new JFrame();&lt;br /&gt;
    frame.getContentPane().add(new CurveApplet());&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    frame.setSize(200, 200);&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class CurveApplet extends JPanel {&lt;br /&gt;
  public CurveApplet() {&lt;br /&gt;
    super(new BorderLayout());&lt;br /&gt;
    pane = new CurvePane();&lt;br /&gt;
    add(pane,&amp;quot;Center&amp;quot;);&lt;br /&gt;
    MouseHandler handler = new MouseHandler();&lt;br /&gt;
    pane.addMouseListener(handler);&lt;br /&gt;
    pane.addMouseMotionListener(handler);&lt;br /&gt;
  }&lt;br /&gt;
  class CurvePane extends JComponent {&lt;br /&gt;
    public CurvePane() {&lt;br /&gt;
      quadCurve = new QuadCurve2D.Double( &lt;br /&gt;
          startQ.x, startQ.y, &lt;br /&gt;
          control.x, control.y,&lt;br /&gt;
          endQ.x, endQ.y);&lt;br /&gt;
      cubicCurve = new CubicCurve2D.Double(&lt;br /&gt;
          startC.x, startC.y, &lt;br /&gt;
          controlStart.x, controlStart.y,&lt;br /&gt;
          controlEnd.x, controlEnd.y,&lt;br /&gt;
          endC.x, endC.y);&lt;br /&gt;
    }&lt;br /&gt;
    public void paint(Graphics g) {&lt;br /&gt;
      Graphics2D g2D = (Graphics2D) g;&lt;br /&gt;
      quadCurve.ctrlx = ctrlQuad.getCenter().x;&lt;br /&gt;
      quadCurve.ctrly = ctrlQuad.getCenter().y;&lt;br /&gt;
      cubicCurve.ctrlx1 = ctrlCubic1.getCenter().x;&lt;br /&gt;
      cubicCurve.ctrly1 = ctrlCubic1.getCenter().y;&lt;br /&gt;
      cubicCurve.ctrlx2 = ctrlCubic2.getCenter().x;&lt;br /&gt;
      cubicCurve.ctrly2 = ctrlCubic2.getCenter().y;&lt;br /&gt;
      g2D.setPaint(Color.BLUE);&lt;br /&gt;
      g2D.draw(quadCurve);&lt;br /&gt;
      g2D.draw(cubicCurve);&lt;br /&gt;
      g2D.setPaint(Color.RED);&lt;br /&gt;
      ctrlQuad.draw(g2D);&lt;br /&gt;
      ctrlCubic1.draw(g2D);&lt;br /&gt;
      ctrlCubic2.draw(g2D);&lt;br /&gt;
      Line2D.Double tangent = new Line2D.Double(startQ, ctrlQuad.getCenter());&lt;br /&gt;
      g2D.draw(tangent);&lt;br /&gt;
      tangent = new Line2D.Double(endQ, ctrlQuad.getCenter());&lt;br /&gt;
      g2D.draw(tangent);&lt;br /&gt;
      tangent = new Line2D.Double(startC, ctrlCubic1.getCenter());&lt;br /&gt;
      g2D.draw(tangent);&lt;br /&gt;
      tangent = new Line2D.Double(endC, ctrlCubic2.getCenter());&lt;br /&gt;
      g2D.draw(tangent);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  Point2D.Double startQ = new Point2D.Double(50, 75);&lt;br /&gt;
  Point2D.Double endQ = new Point2D.Double(150, 75);&lt;br /&gt;
  Point2D.Double control = new Point2D.Double(80, 25); &lt;br /&gt;
  Point2D.Double startC = new Point2D.Double(50, 150); &lt;br /&gt;
  Point2D.Double endC = new Point2D.Double(150, 150); &lt;br /&gt;
  Point2D.Double controlStart = new Point2D.Double(80, 100);&lt;br /&gt;
  Point2D.Double controlEnd = new Point2D.Double(160, 100); &lt;br /&gt;
  Marker ctrlQuad = new Marker(control);&lt;br /&gt;
  Marker ctrlCubic1 = new Marker(controlStart);&lt;br /&gt;
  Marker ctrlCubic2 = new Marker(controlEnd);&lt;br /&gt;
  QuadCurve2D.Double quadCurve; &lt;br /&gt;
  CubicCurve2D.Double cubicCurve; &lt;br /&gt;
  CurvePane pane = new CurvePane();&lt;br /&gt;
  class Marker {&lt;br /&gt;
    public Marker(Point2D.Double control) {&lt;br /&gt;
      center = control; &lt;br /&gt;
      circle = new Ellipse2D.Double(control.x - radius, control.y - radius, 2.0 * radius,&lt;br /&gt;
          2.0 * radius);&lt;br /&gt;
    }&lt;br /&gt;
    public void draw(Graphics2D g2D) {&lt;br /&gt;
      g2D.draw(circle);&lt;br /&gt;
    }&lt;br /&gt;
    Point2D.Double getCenter() {&lt;br /&gt;
      return center;&lt;br /&gt;
    }&lt;br /&gt;
    public boolean contains(double x, double y) {&lt;br /&gt;
      return circle.contains(x, y);&lt;br /&gt;
    }&lt;br /&gt;
    public void setLocation(double x, double y) {&lt;br /&gt;
      center.x = x; &lt;br /&gt;
      center.y = y; &lt;br /&gt;
      circle.x = x - radius; &lt;br /&gt;
      circle.y = y - radius; &lt;br /&gt;
    }&lt;br /&gt;
    Ellipse2D.Double circle; &lt;br /&gt;
    Point2D.Double center; &lt;br /&gt;
    static final double radius = 3;&lt;br /&gt;
  }&lt;br /&gt;
  class MouseHandler extends MouseInputAdapter {&lt;br /&gt;
    public void mousePressed(MouseEvent e) {&lt;br /&gt;
      if (ctrlQuad.contains(e.getX(), e.getY()))&lt;br /&gt;
        selected = ctrlQuad;&lt;br /&gt;
      else if (ctrlCubic1.contains(e.getX(), e.getY()))&lt;br /&gt;
        selected = ctrlCubic1;&lt;br /&gt;
      else if (ctrlCubic2.contains(e.getX(), e.getY()))&lt;br /&gt;
        selected = ctrlCubic2;&lt;br /&gt;
    }&lt;br /&gt;
    public void mouseReleased(MouseEvent e) {&lt;br /&gt;
      selected = null;&lt;br /&gt;
    }&lt;br /&gt;
    public void mouseDragged(MouseEvent e) {&lt;br /&gt;
      if (selected != null) {&lt;br /&gt;
        selected.setLocation(e.getX(), e.getY());&lt;br /&gt;
        pane.repaint(); &lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    Marker selected = null;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spline 2D ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
/*&lt;br /&gt;
 * @(#)Spline2D.java&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright (c) 2003 Martin Krueger&lt;br /&gt;
 * Copyright (c) 2005 David Benson&lt;br /&gt;
 *  &lt;br /&gt;
 */&lt;br /&gt;
import java.awt.geom.Point2D;&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
/**&lt;br /&gt;
 * Interpolates points given in the 2D plane. The resulting spline&lt;br /&gt;
 * is a function s: R -&amp;gt; R^2 with parameter t in [0,1].&lt;br /&gt;
 * &lt;br /&gt;
 * @author krueger&lt;br /&gt;
 */&lt;br /&gt;
public class Spline2D {&lt;br /&gt;
  /** &lt;br /&gt;
   *  Array representing the relative proportion of the total distance&lt;br /&gt;
   *  of each point in the line ( i.e. first point is 0.0, end point is&lt;br /&gt;
   *  1.0, a point halfway on line is 0.5 ).&lt;br /&gt;
   */&lt;br /&gt;
  private double[] t;&lt;br /&gt;
  private Spline splineX;&lt;br /&gt;
  private Spline splineY;&lt;br /&gt;
  /**&lt;br /&gt;
   * Total length tracing the points on the spline&lt;br /&gt;
   */&lt;br /&gt;
  private double length;&lt;br /&gt;
  &lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new Spline2D.&lt;br /&gt;
   * @param points&lt;br /&gt;
   */&lt;br /&gt;
  public Spline2D(Point2D[] points) {&lt;br /&gt;
    double[] x = new double[points.length];&lt;br /&gt;
    double[] y = new double[points.length];&lt;br /&gt;
    &lt;br /&gt;
    for(int i = 0; i&amp;lt; points.length; i++) {&lt;br /&gt;
      x[i] = points[i].getX();&lt;br /&gt;
      y[i] = points[i].getY(); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    init(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new Spline2D.&lt;br /&gt;
   * @param x&lt;br /&gt;
   * @param y&lt;br /&gt;
   */&lt;br /&gt;
  public Spline2D(double[] x, double[] y) {&lt;br /&gt;
    init(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  private void init(double[] x, double[] y) {&lt;br /&gt;
    if (x.length != y.length) {&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;Arrays must have the same length.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (x.length &amp;lt; 2) {&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;Spline edges must have at least two points.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    t = new double[x.length];&lt;br /&gt;
    t[0] = 0.0; // start point is always 0.0&lt;br /&gt;
    &lt;br /&gt;
    // Calculate the partial proportions of each section between each set&lt;br /&gt;
    // of points and the total length of sum of all sections&lt;br /&gt;
    for (int i = 1; i &amp;lt; t.length; i++) {&lt;br /&gt;
      double lx = x[i] - x[i-1];&lt;br /&gt;
      double ly = y[i] - y[i-1];&lt;br /&gt;
      // If either diff is zero there is no point performing the square root&lt;br /&gt;
      if ( 0.0 == lx ) {&lt;br /&gt;
        t[i] = Math.abs(ly);&lt;br /&gt;
      } else if ( 0.0 == ly ) {&lt;br /&gt;
        t[i] = Math.abs(lx);&lt;br /&gt;
      } else {&lt;br /&gt;
        t[i] = Math.sqrt(lx*lx+ly*ly);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      length += t[i];&lt;br /&gt;
      t[i] += t[i-1];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for(int i = 1; i&amp;lt; (t.length)-1; i++) {&lt;br /&gt;
      t[i] = t[i] / length;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    t[(t.length)-1] = 1.0; // end point is always 1.0&lt;br /&gt;
    &lt;br /&gt;
    splineX = new Spline(t, x);&lt;br /&gt;
    splineY = new Spline(t, y);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @param t 0 &amp;lt;= t &amp;lt;= 1&lt;br /&gt;
   */&lt;br /&gt;
  public double[] getPoint(double t) {&lt;br /&gt;
    double[] result = new double[2];&lt;br /&gt;
    result[0] = splineX.getValue(t);&lt;br /&gt;
    result[1] = splineY.getValue(t);&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  /**&lt;br /&gt;
   * Used to check the correctness of this spline&lt;br /&gt;
   */&lt;br /&gt;
  public boolean checkValues() {&lt;br /&gt;
    return (splineX.checkValues() &amp;amp;&amp;amp; splineY.checkValues());&lt;br /&gt;
  }&lt;br /&gt;
  public double getDx(double t) {&lt;br /&gt;
    return splineX.getDx(t);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public double getDy(double t) {&lt;br /&gt;
    return splineY.getDx(t);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public Spline getSplineX() {&lt;br /&gt;
    return splineX;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public Spline getSplineY() {&lt;br /&gt;
    return splineY;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public double getLength() {&lt;br /&gt;
    return length;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/* This code is PUBLIC DOMAIN */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Interpolates given values by B-Splines.&lt;br /&gt;
 * &lt;br /&gt;
 * @author krueger&lt;br /&gt;
 */&lt;br /&gt;
 class Spline {&lt;br /&gt;
  private double[] xx;&lt;br /&gt;
  private double[] yy;&lt;br /&gt;
  private double[] a;&lt;br /&gt;
  private double[] b;&lt;br /&gt;
  private double[] c;&lt;br /&gt;
  private double[] d;&lt;br /&gt;
  /** tracks the last index found since that is mostly commonly the next one used */&lt;br /&gt;
  private int storageIndex = 0;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new Spline.&lt;br /&gt;
   * @param xx&lt;br /&gt;
   * @param yy&lt;br /&gt;
   */&lt;br /&gt;
  public Spline(double[] xx, double[] yy) {&lt;br /&gt;
    setValues(xx, yy);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Set values for this Spline.&lt;br /&gt;
   * @param xx&lt;br /&gt;
   * @param yy&lt;br /&gt;
   */&lt;br /&gt;
  public void setValues(double[] xx, double[] yy) {&lt;br /&gt;
    this.xx = xx;&lt;br /&gt;
    this.yy = yy;&lt;br /&gt;
    if (xx.length &amp;gt; 1) {&lt;br /&gt;
      calculateCoefficients();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns an interpolated value.&lt;br /&gt;
   * @param x&lt;br /&gt;
   * @return the interpolated value&lt;br /&gt;
   */&lt;br /&gt;
  public double getValue(double x) {&lt;br /&gt;
    if (xx.length == 0) {&lt;br /&gt;
      return Double.NaN;&lt;br /&gt;
    }&lt;br /&gt;
    if (xx.length == 1) {&lt;br /&gt;
      if (xx[0] == x) {&lt;br /&gt;
        return yy[0];&lt;br /&gt;
      } else {&lt;br /&gt;
        return Double.NaN;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    int index = Arrays.binarySearch(xx, x);&lt;br /&gt;
    if (index &amp;gt; 0) {&lt;br /&gt;
      return yy[index];&lt;br /&gt;
    }&lt;br /&gt;
    index = - (index + 1) - 1;&lt;br /&gt;
    //TODO linear interpolation or extrapolation&lt;br /&gt;
    if (index &amp;lt; 0) {&lt;br /&gt;
      return yy[0];&lt;br /&gt;
    }&lt;br /&gt;
    return a[index]&lt;br /&gt;
      + b[index] * (x - xx[index])&lt;br /&gt;
      + c[index] * Math.pow(x - xx[index], 2)&lt;br /&gt;
      + d[index] * Math.pow(x - xx[index], 3);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns an interpolated value. To be used when a long sequence of values&lt;br /&gt;
   * are required in order, but ensure checkValues() is called beforehand to&lt;br /&gt;
   * ensure the boundary checks from getValue() are made&lt;br /&gt;
   * @param x&lt;br /&gt;
   * @return the interpolated value&lt;br /&gt;
   */&lt;br /&gt;
  public double getFastValue(double x) {&lt;br /&gt;
    // Fast check to see if previous index is still valid&lt;br /&gt;
    if (storageIndex &amp;gt; -1 &amp;amp;&amp;amp; storageIndex &amp;lt; xx.length-1 &amp;amp;&amp;amp; x &amp;gt; xx[storageIndex] &amp;amp;&amp;amp; x &amp;lt; xx[storageIndex + 1]) {&lt;br /&gt;
    } else {&lt;br /&gt;
      int index = Arrays.binarySearch(xx, x);&lt;br /&gt;
      if (index &amp;gt; 0) {&lt;br /&gt;
        return yy[index];&lt;br /&gt;
      }&lt;br /&gt;
      index = - (index + 1) - 1;&lt;br /&gt;
      storageIndex = index;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    //TODO linear interpolation or extrapolation&lt;br /&gt;
    if (storageIndex &amp;lt; 0) {&lt;br /&gt;
      return yy[0];&lt;br /&gt;
    }&lt;br /&gt;
    double value = x - xx[storageIndex];&lt;br /&gt;
    return a[storageIndex]&lt;br /&gt;
          + b[storageIndex] * value&lt;br /&gt;
          + c[storageIndex] * (value * value)&lt;br /&gt;
          + d[storageIndex] * (value * value * value);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Used to check the correctness of this spline&lt;br /&gt;
   */&lt;br /&gt;
  public boolean checkValues() {&lt;br /&gt;
    if (xx.length &amp;lt; 2) {&lt;br /&gt;
      return false;&lt;br /&gt;
    } else {&lt;br /&gt;
      return true;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the first derivation at x.&lt;br /&gt;
   * @param x&lt;br /&gt;
   * @return the first derivation at x&lt;br /&gt;
   */&lt;br /&gt;
  public double getDx(double x) {&lt;br /&gt;
    if (xx.length == 0 || xx.length == 1) {&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
    int index = Arrays.binarySearch(xx, x);&lt;br /&gt;
    if (index &amp;lt; 0) {&lt;br /&gt;
      index = - (index + 1) - 1;&lt;br /&gt;
    }&lt;br /&gt;
    return b[index]&lt;br /&gt;
      + 2 * c[index] * (x - xx[index])&lt;br /&gt;
      + 3 * d[index] * Math.pow(x - xx[index], 2);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Calculates the Spline coefficients.&lt;br /&gt;
   */&lt;br /&gt;
  private void calculateCoefficients() {&lt;br /&gt;
    int N = yy.length;&lt;br /&gt;
    a = new double[N];&lt;br /&gt;
    b = new double[N];&lt;br /&gt;
    c = new double[N];&lt;br /&gt;
    d = new double[N];&lt;br /&gt;
    if (N == 2) {&lt;br /&gt;
      a[0] = yy[0];&lt;br /&gt;
      b[0] = yy[1] - yy[0];&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    double[] h = new double[N - 1];&lt;br /&gt;
    for (int i = 0; i &amp;lt; N - 1; i++) {&lt;br /&gt;
      a[i] = yy[i];&lt;br /&gt;
      h[i] = xx[i + 1] - xx[i];&lt;br /&gt;
      // h[i] is used for division later, avoid a NaN&lt;br /&gt;
      if (h[i] == 0.0) {&lt;br /&gt;
        h[i] = 0.01;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    a[N - 1] = yy[N - 1];&lt;br /&gt;
    double[][] A = new double[N - 2][N - 2];&lt;br /&gt;
    double[] y = new double[N - 2];&lt;br /&gt;
    for (int i = 0; i &amp;lt; N - 2; i++) {&lt;br /&gt;
      y[i] =&lt;br /&gt;
        3&lt;br /&gt;
          * ((yy[i + 2] - yy[i + 1]) / h[i&lt;br /&gt;
            + 1]&lt;br /&gt;
            - (yy[i + 1] - yy[i]) / h[i]);&lt;br /&gt;
      A[i][i] = 2 * (h[i] + h[i + 1]);&lt;br /&gt;
      if (i &amp;gt; 0) {&lt;br /&gt;
        A[i][i - 1] = h[i];&lt;br /&gt;
      }&lt;br /&gt;
      if (i &amp;lt; N - 3) {&lt;br /&gt;
        A[i][i + 1] = h[i + 1];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    solve(A, y);&lt;br /&gt;
    for (int i = 0; i &amp;lt; N - 2; i++) {&lt;br /&gt;
      c[i + 1] = y[i];&lt;br /&gt;
      b[i] = (a[i + 1] - a[i]) / h[i] - (2 * c[i] + c[i + 1]) / 3 * h[i];&lt;br /&gt;
      d[i] = (c[i + 1] - c[i]) / (3 * h[i]);&lt;br /&gt;
    }&lt;br /&gt;
    b[N - 2] =&lt;br /&gt;
      (a[N - 1] - a[N - 2]) / h[N&lt;br /&gt;
        - 2]&lt;br /&gt;
        - (2 * c[N - 2] + c[N - 1]) / 3 * h[N&lt;br /&gt;
        - 2];&lt;br /&gt;
    d[N - 2] = (c[N - 1] - c[N - 2]) / (3 * h[N - 2]);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Solves Ax=b and stores the solution in b.&lt;br /&gt;
   */&lt;br /&gt;
  public void solve(double[][] A, double[] b) {&lt;br /&gt;
    int n = b.length;&lt;br /&gt;
    for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
      A[i][i - 1] = A[i][i - 1] / A[i - 1][i - 1];&lt;br /&gt;
      A[i][i] = A[i][i] - A[i - 1][i] * A[i][i - 1];&lt;br /&gt;
      b[i] = b[i] - A[i][i - 1] * b[i - 1];&lt;br /&gt;
    }&lt;br /&gt;
    b[n - 1] = b[n - 1] / A[n - 1][n - 1];&lt;br /&gt;
    for (int i = b.length - 2; i &amp;gt;= 0; i--) {&lt;br /&gt;
      b[i] = (b[i] - A[i][i + 1] * b[i + 1]) / A[i][i];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>