Lines

The Line Project is a simple project demonstrating how to use the MC.draw.line() method. The simulation illustrates the “Earth – Venus” pentagon. In short, an earth year is 13/8ths of that of Venus. If you draw a line between the two bodies (over a number of years), the following pattern emerges.

Code

This Project utilises:

  • ConBoxes and GUI for start/restart, set speed and pause
  • A novel use of a pair Sprites as “calculators” for the point ends (they are not rendered)
  • MC.draw.line() to draw a large series of white, 90% transparent lines.
// MaxCanvas Project
// 07-Lines.JS File (April 2019)
//
// Required to drag MC.js into Intellisense
// thanks to https://visualstudiomagazine.com/blogs/tool-tracker/2018/07/use-javascript-code.aspx (Dec 2018)
/// <reference path="MC.js" />

window.onload = (function() {

// AQUIRE HTML DOM CANVAS REFERENCE
var c=document.getElementById("canvas");

//////////////////////////
// INITIALISE MC Engine //
//////////////////////////
MC.init(c);

// Configure .game
MC.game.physicsUpdates = 1;     // Will Speed up the simulation .. this many lines added per frame
MC.canvas.setSize(600,400)

///////////////////////////
// END OF Initialisation //
///////////////////////////
//-----------------------------------------------------------------------------
//////////////////////////
// VARIABLE DECLARATION //
//////////////////////////

    // GUI Creation
    var GUI = new MC.GUI();
    // Start / Restart ConBox - calls "Start()"
    var Restart = new MC.ConBox({ width: 150,
                                height: 40,
                                text: "Restart",
                                onClick: function () { start(); } 
                             });
    // Pause ConBox - toggles MC.game.paused
    var Pause = new MC.ConBox({ width: 150,
                                height: 40,
                                text: "Pause",
                                onClick: function () {
                                    MC.game.paused = !MC.game.paused;
                                    if (MC.game.paused) { Pause.text = "Unpause" ;}
                                    else {Pause.text = "Pause";}
                                    } 
                             });
    // Speed ConBox - cycles MC.physicsUpdates & calls "Start()"
    var Speed = new MC.ConBox({ width: 150,
                                height: 40,
                                text: "Speed " + MC.game.physicsUpdates,
                                onClick: function () {
                                    var spd = 0;
                                    switch (MC.game.physicsUpdates) {
                                        case 1:
                                            spd = 5;
                                            break;
                                        case 5:
                                            spd = 10;
                                            break;
                                        case 10:
                                            spd = 15;
                                            break;
                                        case 15:
                                            spd = 20;
                                            break;
                                        case 20:
                                            spd = 1;
                                            break;
                                        default:
                                            spd = 5;
                                    }
                                    MC.game.physicsUpdates = spd;
                                    Speed.text = "Speed "+spd;
                                    start();
                                }
                             });
    GUI.push(Restart,Pause,Speed);
    MC.mouse.onClickL = function () {
        GUI.click();
    };    
    
    // Restart function
    var start = function () {
        Lines = [];
        Ends.bin[0].angle = Ends.bin[1].angle = 0;
        };
    
    
    var color = new MC.Color(255,255,255,0.1); 
    var Lines = [];
    var Ends = new MC.SpriteBin();
    
    // Going to utilise the Sprite Class
    // Using update function to emulate a body orbiting the graphic centre, with the angle and angleVel tracking an orbital radius angle
    // Don't have to render them either
    var end1 = new MC.Sprite({type: "circ", angleVel: 360/13 * 100, size2: 120 });
    end1.dev.update = function () {
                                var rad = new MC.Point(0,end1.size2);
                                rad.rotate(end1.angle);
                                rad.add(MC.canvas.midX+100, MC.canvas.midY);
                                end1.moveTo(rad);
                             };
    
    var end2 = end1.clone();
    end2.setValues ({angleVel: 360/8 * 100, size2: 180});
    end2.dev.update = function () {
                                var rad = new MC.Point(0,end2.size2);
                                rad.rotate(end2.angle);
                                rad.add(MC.canvas.midX+100, MC.canvas.midY);
                                end2.moveTo(rad);
                             };
    Ends.push(end1, end2);

//////////////////////////
// END OF declarations  //
//////////////////////////
//-----------------------------------------------------------------------------
//////////////////////////
//      GAME LOOP       //
//////////////////////////

// first call, request subsequently made within
gameLoop();

function gameLoop() {
    // ESSENTIAL MAINTAINANCE
    requestAnimationFrame(gameLoop);
    MC.game.update();                   
    
    // PHYSICS UPDATE LOOP
    for (var i = 0; i < MC.game.physicsUpdates; i++) {
        Ends.update();
        // Populate the Lines array with the position of the 2 Sprites
        if (Lines.length < 5000 && !MC.game.paused) Lines.push(Ends.bin[0].pos.clone(),Ends.bin[1].pos.clone());
    }
    
    // NON-PHYSICS UPDATES
    GUI.update();  

    // RENDER
    // Stage 1.  Clear the canvas
    MC.draw.clearCanvas("Black");

    // Stage 2.  Render Sprites
        // Draw the lines
    for (var i = 0; i < Lines.length; i = i+2) {
        MC.draw.line(Lines[i],Lines[i+1],color,1);
    }
    
    // Stage 3.  Render GUI
    GUI.render(0,0);
}

}); // EoF