Added rotating triangles
Added triangles which are animated in combination with window.requestAnimationFrame and are drawn directly to the canvas
This commit is contained in:
commit
b87de3f8cc
13
index.html
Normal file
13
index.html
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Canvas Playground</title>
|
||||
<link rel="stylesheet" type="text/css" href="main.css" />
|
||||
<script type="application/javascript" src="src/draw/point.js"></script>
|
||||
<script type="application/javascript" src="src/draw/triangle.js"></script>
|
||||
<script type="application/javascript" src="src/index.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<canvas id='canvas'></canvas>
|
||||
</body>
|
||||
</html>
|
8
main.css
Normal file
8
main.css
Normal file
@ -0,0 +1,8 @@
|
||||
html, body, canvas {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
background: black;
|
||||
}
|
27
src/draw/point.js
Normal file
27
src/draw/point.js
Normal file
@ -0,0 +1,27 @@
|
||||
class Point {
|
||||
|
||||
constructor(x, y) {
|
||||
this.my_x = x
|
||||
this.my_y = y
|
||||
}
|
||||
|
||||
get x() {
|
||||
return this.my_x
|
||||
}
|
||||
|
||||
get y() {
|
||||
return this.my_y
|
||||
}
|
||||
|
||||
get coordinates() {
|
||||
return [this.my_x, this.my_y]
|
||||
}
|
||||
|
||||
multiplyWith([[a11, a12], [a21, a22]]) {
|
||||
return new Point(a11 * this.my_x + a21 * this.my_y, a12 * this.my_x + a22 * this.my_y)
|
||||
}
|
||||
|
||||
translateBy(offset) {
|
||||
return new Point(this.my_x + offset.x, this.my_y + offset.y)
|
||||
}
|
||||
}
|
32
src/draw/triangle.js
Normal file
32
src/draw/triangle.js
Normal file
@ -0,0 +1,32 @@
|
||||
class Triangle {
|
||||
|
||||
constructor(radius, angle = 0) {
|
||||
this.radius = radius
|
||||
this.angle = angle
|
||||
this.a = new Point(0, -radius).multiplyWith(getRotationMatrix(angle))
|
||||
this.b = this.a.multiplyWith(getRotationMatrix(120))
|
||||
this.c = this.a.multiplyWith(getRotationMatrix(240))
|
||||
}
|
||||
|
||||
drawAt(context, color, centerPoint = new Point(0, 0)) {
|
||||
context.strokeStyle = color
|
||||
context.beginPath()
|
||||
context.moveTo(...this.a.translateBy(centerPoint).coordinates)
|
||||
context.lineTo(...this.b.translateBy(centerPoint).coordinates)
|
||||
context.lineTo(...this.c.translateBy(centerPoint).coordinates)
|
||||
context.closePath()
|
||||
context.stroke()
|
||||
}
|
||||
|
||||
cloneAndRotateBy(angle) {
|
||||
return new Triangle(radius, this.angle + angle)
|
||||
}
|
||||
|
||||
rotateBy(angle) {
|
||||
this.angle = (this.angle + angle >= 360) ? this.angle + angle - 360 : this.angle + angle
|
||||
const rotation = getRotationMatrix(angle)
|
||||
this.a = this.a.multiplyWith(rotation)
|
||||
this.b = this.b.multiplyWith(rotation)
|
||||
this.c = this.c.multiplyWith(rotation)
|
||||
}
|
||||
}
|
58
src/index.js
Normal file
58
src/index.js
Normal file
@ -0,0 +1,58 @@
|
||||
let context;
|
||||
let counter = 0;
|
||||
const maxHeight = document.documentElement.clientHeight;
|
||||
const maxWidth = document.documentElement.clientWidth;
|
||||
let center = new Point(maxWidth / 2, maxHeight / 2);
|
||||
let growFactor = 0;
|
||||
let centerTriangle;
|
||||
let wanderingTriangle;
|
||||
const border = 100;
|
||||
let offsetY = border, offsetX = border;
|
||||
|
||||
Math.radians = degrees => degrees * (Math.PI / 180)
|
||||
Math.degrees = radians => radians * (180 / Math.PI)
|
||||
|
||||
window.onload = event => {
|
||||
centerTriangle = new Triangle(300)
|
||||
wanderingTriangle = new Triangle(100)
|
||||
const canvasNode = document.querySelector('#canvas')
|
||||
canvasNode.height = maxHeight
|
||||
canvasNode.width = maxWidth
|
||||
context = canvasNode.getContext('2d')
|
||||
window.requestAnimationFrame(drawFrame)
|
||||
}
|
||||
|
||||
function clearCanvas(ctx) {
|
||||
ctx.fillStyle = '#000000'
|
||||
ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)
|
||||
}
|
||||
|
||||
function drawFrame(timestamp) {
|
||||
clearCanvas(context)
|
||||
// offsetY = (offsetY >= context.canvas.height) ? 0 : offsetY + 1;
|
||||
// offsetX = (offsetX >= context.canvas.width) ? 0 : offsetX + 1;
|
||||
centerTriangle.drawAt(context, '#f02af7', center)
|
||||
centerTriangle.rotateBy(1)
|
||||
|
||||
if (offsetX < maxWidth - border && offsetY <= border) {
|
||||
offsetX += 10
|
||||
} else if (offsetX >= maxWidth - border && offsetY < maxHeight - border) {
|
||||
offsetY += 10
|
||||
} else if (offsetX > border && offsetY >= maxHeight - border) {
|
||||
offsetX -= 10
|
||||
} else {
|
||||
offsetY -= 10
|
||||
}
|
||||
const currentOffset = new Point(offsetX, offsetY)
|
||||
wanderingTriangle.drawAt(context, '#f02af7', currentOffset)
|
||||
wanderingTriangle.rotateBy(4)
|
||||
// centerTriangle.drawAt(context, '#f02af7', center.translateBy(new Point(center.x - xOffset, center.y - offset)))
|
||||
// centerTriangle.drawAt(context, '#f02af7', center.translateBy(new Point(-center.x + xOffset, center.y - offset)))
|
||||
window.requestAnimationFrame(drawFrame)
|
||||
}
|
||||
|
||||
const getRotationMatrix = angle => {
|
||||
const phi = Math.radians(angle)
|
||||
return [[Math.cos(phi), -Math.sin(phi)],
|
||||
[Math.sin(phi), Math.cos(phi)]]
|
||||
}
|
Loading…
Reference in New Issue
Block a user