Lissijous Curves

HTML

<script src="http://d3js.org/d3.v2.js"></script>
  x-frequency:
<input id="xFrequency" type="number" name="quantity" min=".1" max="10" step=.1 value="1">y-frequency:
<input id="yFrequency" type="number" name="quantity" min=".1" max="10" step=.1 value="2">adjust phase:
<input id="phaseDifference" type="number" name="quantity" min="-100" max="100" step=.1 value="0">

CSS

.chart {
          font-family: Arial, sans-serif;
          font-size: 10px;
      }
      .axis path, .axis line {
          fill: none;
          stroke: #000;
          shape-rendering: crispEdges;
      }
      .bar {
          fill: purple;
      }

JavaScript

var lineFunction = d3.svg.line()
    .x(function (d) {
    return x(d.x);
})
    .y(function (d) {
    return y(d.y);
})
    .interpolate("linear");

var width = 600;
var height = 600;

var x = d3.scale.linear()
    .domain([-1, 1])
    .range([0, width]);

var y = d3.scale.linear()
    .domain([-1, 1])
    .range([height, 0]);

var t = 0;
var point = {
    x: 0,
    y: 0
};

//Create SVG element
var svg = d3.select("body")
    .append("svg")
    .attr("width", width)
    .attr("height", height);

var epsilon = 0.1;

function drawNewPoint(tx, ty, point) {
    oldpoint = {
        x: point.x,
        y: point.y
    }; // need copy of old point for drawing line
    var xfreq = 1 * $("#xFrequency").val();
    var yfreq = 1 * $("#yFrequency").val();
    point.x = Math.sin(tx);
    point.y = Math.sin(ty + yfreq * $("#phaseDifference").val());

    setTimeout(function () {
        drawNewPoint(tx += epsilon * xfreq, ty += epsilon * yfreq, point);
    }, 0.1);

    svg.append("path")
        .attr("d", lineFunction([oldpoint, point]))

    .attr("stroke", "blue")
        .attr("stroke-width", 2)
        .attr("fill", "red")
        .transition().duration(80000).style("opacity", 0).remove();

    svg.append("circle")
        .attr("cx", x(point.x))
        .attr("cy", y(point.y))
        .attr("r", 2)
        .transition().duration(80000).style("opacity", 0).remove();



}

drawNewPoint(0, 0, point);