This JavaScript program demonstrates how to draw lines in motion on a canvas element.
<!DOCTYPE html>
<html>
<head>
<title>XoaX.net's Javascript</title>
<script type="text/javascript" src="LinesInMotion.js"></script>
</head>
<body onload="Initialize()">
<canvas id="idCanvas" width="640" height ="480" style="background-color: #F0F0F0;"></canvas>
</body>
</html>var gqContext2D = null;
var gqMovingLines = null;
function AnimationLoop() {
gqContext2D.clearRect(0, 0, 640, 480);
gqMovingLines.mfnAdvance();
gqMovingLines.mfnDrawLines(gqContext2D);
setTimeout(AnimationLoop, 50);
}
function Initialize() {
var qCanvas = document.getElementById("idCanvas");
gqContext2D = qCanvas.getContext("2d");
gqMovingLines = new CMovingLines();
AnimationLoop();
}
function CreateRandowUnitVector() {
return new CVector(Math.cos(Math.PI*2.0*Math.random()), Math.sin(Math.PI*2.0*Math.random()));
}
function CreateRandowPoint() {
return new CPoint(639.0*Math.random(), 479.0*Math.random());
}
function CPoint(dX, dY) {
this.mdX = dX;
this.mdY = dY;
}
function CVector(dDx, dDy) {
this.mdDx = dDx;
this.mdDy = dDy;
}
function CParametricLinearMotion(qP, qV) {
this.mqP = qP;
this.mqV = qV;
this.mdSpeed = 15.0; // This will be one, for now
this.mfnAdvance = function() {
// Find any intersections for both and x and y.
// Determine which is first
let dNextX = this.mqP.mdX + this.mdSpeed*this.mqV.mdDx;
if (dNextX > 639.0) {// If x hits reverse it
this.mqP.mdX = 639.0 + 639.0 - dNextX;
this.mqV.mdDx = -this.mqV.mdDx;
} else if (dNextX < 0.0) {
this.mqP.mdX = -dNextX;
this.mqV.mdDx = -this.mqV.mdDx;
} else {
this.mqP.mdX = dNextX;
}
let dNextY = this.mqP.mdY + this.mdSpeed*this.mqV.mdDy;
if (dNextY > 479.0) {// If x hits reverse it
this.mqP.mdY = 479.0 + 479.0 - dNextY;
this.mqV.mdDy = -this.mqV.mdDy;
} else if (dNextY < 0.0) {
this.mqP.mdY = -dNextY;
this.mqV.mdDy = -this.mqV.mdDy;
} else {
this.mqP.mdY = dNextY;
}
}
this.mfnGetPosition = function() {
return new CPoint(this.mqP.mdX, this.mqP.mdY);
}
}
// A Line Segment Contructor
function CLineSegment(qP1, qP2) {
this.mqP1 = qP1;
this.mqP2 = qP2;
this.mfnDrawLine = function(qContext2D) {
// The line width and color will be set elsewhere
qContext2D.beginPath();
qContext2D.moveTo(this.mqP1.mdX, this.mqP1.mdY);
qContext2D.lineTo(this.mqP2.mdX, this.mqP2.mdY);
qContext2D.stroke();
}
}
function CMovingLines() {
// This will have two parametric lines of motion
// Use the global alpha to draw the lines
this.mqMotion1 = new CParametricLinearMotion(CreateRandowPoint(), CreateRandowUnitVector());
this.mqMotion2 = new CParametricLinearMotion(CreateRandowPoint(), CreateRandowUnitVector());
this.mqaLines = [];
this.mfnAdvance = function() {
this.mqMotion1.mfnAdvance();
this.mqMotion2.mfnAdvance();
// Add a new line at the first index
this.mqaLines.unshift(new CLineSegment(this.mqMotion1.mfnGetPosition(), this.mqMotion2.mfnGetPosition()));
if (this.mqaLines.length > 25) {
this.mqaLines.pop();
}
}
this.mfnDrawLines = function(qContext2D) {
gqContext2D.globalAlpha = 1.0;
gqContext2D.strokeStyle = "black";
for(var i in this.mqaLines) {
this.mqaLines[i].mfnDrawLine(gqContext2D);
gqContext2D.globalAlpha *= 0.75;
}
gqContext2D.globalAlpha = 1.0;
}
}
© 20072025 XoaX.net LLC. All rights reserved.