|
Value of d:
Select 1-9 to turn the cubes on and off | |
| Near Plane: | |
| Far Plane: |
<head>
<script type="text/javascript" src="code.js" defer> </script>
<script type="text/javascript" src="UI.js" defer> </script>
</head>
<body>
<canvas id="canvas" width=400 height=400 style="border:2px solid"></canvas>
<p>
<table>
<tr><td>
Value of d:
<input type="range" min="1" max="50" value="25" class="slider"
id="dInput" onchange="DrawScene()" list="ticks">
<output for="dInput" id="dInputValue"></output>
<datalist id="ticks">
<option value="1"></option>
<option value="12"></option>
<option value="25"></option>
<option value="36"></option>
<option value="50"></option>
</datalist>
<p>
Select 1-9 to turn the cubes on and off
</td></tr>
<tr><td>
Near Plane: <input id="near" type="number" min = 0 max=100 >
</td><td rowspan =2>
<input type="button" id="DoIt" value = "Update Near/Far"></button>
</td></tr>
<tr><td>
Far Plane: <input id="far" type="number" min = 10 max=100>
</td></tr>
</table>
</body>
'use strict'
var canvas = document.getElementById('canvas');
canvas.tabIndex=0;
canvas.addEventListener("keypress", Keypress);
var ctx = canvas.getContext('2d');
ctx.transform(1,0,0,-1,0,canvas.height);
var d = 25;
document.getElementById('dInput').value = d;
var display = [false, false, false,
false, true, false,
false, false, false];
let nearBox = document.getElementById('near');
let farBox = document.getElementById('far');
let near = 10
let far = 20
function Update() {
let near = nearBox.value;
let far = farBox.value;
if (near < far) {
UpdateVerts(near, far);
DrawScene();
}
}
let DoItButton = document.getElementById("DoIt");
DoItButton.addEventListener("click", Update);
UpdateVerts(near,far);
nearBox.value = near
farBox.value = far
DrawScene();
'use strict'
let CUBE_VERTS = [[-10,-10,near], [10,-10,near], [10,10,near], [-10,10,near],
[-10,-10,far], [10,-10,far], [10,10,far], [-10,10,far]]
const CUBE_EDGES = [
[0,1,"red"], [1,2,"red"], [2,3,"red"], [3,0,"red"],
[4,5,"green"], [5,6,"green"], [6,7,"green"], [7,4,"green"],
[0,4,"blue"], [1,5,"blue"], [2,6,"blue"], [3,7,"blue"],
]
function UpdateVerts(near, far) {
for(let i =0; i < 4; i++) {
CUBE_VERTS[i][2] = near;
CUBE_VERTS[i+4][2] = far;
}
}
function Project(pt, tx, ty) {
let x = (pt[0]+tx)*(d/pt[2]);
let y = (pt[1]+ty)*(d/pt[2]);
return [x,y];
}
function DrawLine(ctx, start, end, tx, ty) {
let a = Project(start, tx, ty);
let b = Project(end, tx, ty);
ctx.beginPath();
ctx.moveTo(a[0], a[1]);
ctx.lineTo(b[0], b[1]);
ctx.stroke();
ctx.closePath();
}
function Cube(ctx,tx, ty) {
for (let i=0; i<CUBE_EDGES.length; i++) {
let start = CUBE_EDGES[i][0];
let end = CUBE_EDGES[i][1];
let color = CUBE_EDGES[i][2];
ctx.strokeStyle = color;
DrawLine(ctx, CUBE_VERTS[start],CUBE_VERTS[end], tx, ty);
}
}
function Keypress(evnt) {
if (evnt.key >= '1' && evnt.key <= '9') {
let pos = parseInt(event.key-'1');
display[pos] = !display[pos];
DrawScene();
}
}
function DrawScene() {
ctx.clearRect(0,0,canvas.width, canvas.height);
d = document.getElementById('dInput').value
document.getElementById('dInputValue').value = d
ctx.save()
ctx.translate(canvas.width/2, canvas.height/2);
var pos =0;
for(let i =-1; i<2; i++) {
for (let j=-1; j<2; j++) {
if(display[pos]) {
Cube(ctx,50*j,50*i);
}
pos ++;
}
}
ctx.restore();
}