Add Hello Mouse
This sketch draws a bunch of short line segments that move and change color according to their distance and orientation to the mouse cursor.
This commit is contained in:
parent
56e7160ea6
commit
dfb0cad2c4
2 changed files with 149 additions and 0 deletions
26
hello-mouse/index.html
Normal file
26
hello-mouse/index.html
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>p5.js example</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 800px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="../p5.js"></script>
|
||||||
|
<!-- <script src="../addons/p5.sound.js"></script> -->
|
||||||
|
<script src="sketch.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Hello Mouse!</h1>
|
||||||
|
<main>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
123
hello-mouse/sketch.js
Normal file
123
hello-mouse/sketch.js
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
const DEBUG = false;
|
||||||
|
|
||||||
|
let lines = new Array();
|
||||||
|
|
||||||
|
class Point {
|
||||||
|
constructor(x, y) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
length() {
|
||||||
|
return Math.sqrt(this.x * this.x + this.y * this.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
normalize() {
|
||||||
|
let length = this.length();
|
||||||
|
this.x = this.x / length;
|
||||||
|
this.y = this.y / length;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale(factor) {
|
||||||
|
this.x = this.x * factor;
|
||||||
|
this.y = this.y * factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Line {
|
||||||
|
constructor(point, length) {
|
||||||
|
this.point = point;
|
||||||
|
this.length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw(mousePoint) {
|
||||||
|
let distance = this._distanceBetweenPointAndPoint(mousePoint);
|
||||||
|
let weight = this._mapValueInRangeToRange(distance, 0, 600, 1, 12);
|
||||||
|
|
||||||
|
colorMode(HSB, 255);
|
||||||
|
let hue = this._mapValueInRangeToRange(distance, 0, 800, 140, 200);
|
||||||
|
stroke(hue, 180, 255);
|
||||||
|
strokeCap(SQUARE);
|
||||||
|
strokeWeight(weight);
|
||||||
|
|
||||||
|
let pointMouseVector = new Point(mousePoint.x - this.point.x, mousePoint.y - this.point.y);
|
||||||
|
pointMouseVector.normalize();
|
||||||
|
|
||||||
|
let pointMouseVectorNormal1 = new Point(-pointMouseVector.y, pointMouseVector.x);
|
||||||
|
let pointMouseVectorNormal2 = new Point(pointMouseVector.y, -pointMouseVector.x);
|
||||||
|
|
||||||
|
const halfLength = this.length / 2.0;
|
||||||
|
|
||||||
|
// line(
|
||||||
|
// this.point.x - halfLength,
|
||||||
|
// this.point.y,
|
||||||
|
// this.point.x + halfLength,
|
||||||
|
// this.point.y);
|
||||||
|
line(
|
||||||
|
this.point.x + pointMouseVectorNormal1.x * halfLength,
|
||||||
|
this.point.y + pointMouseVectorNormal1.y * halfLength,
|
||||||
|
this.point.x + pointMouseVectorNormal2.x * halfLength,
|
||||||
|
this.point.y + pointMouseVectorNormal2.y * halfLength);
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
let pointMouseVectorNormal1 = new Point(-pointMouseVector.y, pointMouseVector.x);
|
||||||
|
let pointMouseVectorNormal2 = new Point(pointMouseVector.y, -pointMouseVector.x);
|
||||||
|
|
||||||
|
strokeWeight(1);
|
||||||
|
|
||||||
|
stroke('red');
|
||||||
|
line(
|
||||||
|
this.point.x,
|
||||||
|
this.point.y,
|
||||||
|
this.point.x + pointMouseVector.x * halfLength,
|
||||||
|
this.point.y + pointMouseVector.y * halfLength);
|
||||||
|
|
||||||
|
stroke('blue');
|
||||||
|
line(
|
||||||
|
this.point.x,
|
||||||
|
this.point.y,
|
||||||
|
this.point.x + pointMouseVectorNormal1.x * halfLength,
|
||||||
|
this.point.y + pointMouseVectorNormal1.y * halfLength);
|
||||||
|
|
||||||
|
stroke('orange');
|
||||||
|
line(
|
||||||
|
this.point.x,
|
||||||
|
this.point.y,
|
||||||
|
this.point.x + pointMouseVectorNormal2.x * halfLength,
|
||||||
|
this.point.y + pointMouseVectorNormal2.y * halfLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compute the Euclidean distance between @c this.point and the argument.
|
||||||
|
/// @see https://en.wikipedia.org/wiki/Euclidean_distance
|
||||||
|
_distanceBetweenPointAndPoint(point) {
|
||||||
|
return Math.sqrt(Math.pow(this.point.x - point.x, 2) + Math.pow(this.point.y - point.y, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Map an input value in an input range to a value in the output range.
|
||||||
|
/// @see https://stackoverflow.com/questions/5731863/mapping-a-numeric-range-onto-another
|
||||||
|
_mapValueInRangeToRange(input, inputStart, inputEnd, outputStart, outputEnd) {
|
||||||
|
return outputStart + ((outputEnd - outputStart) / (inputEnd - inputStart)) * (input - inputStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createLines() {
|
||||||
|
for (let x = 8; x < 800; x += 24) {
|
||||||
|
for (let y = 8; y < 600; y += 24) {
|
||||||
|
lines.push(new Line(new Point(x, y), 16));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
createLines();
|
||||||
|
createCanvas(800, 600);
|
||||||
|
}
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
background(240);
|
||||||
|
let mousePoint = new Point(mouseX, mouseY);
|
||||||
|
for (let l of lines) {
|
||||||
|
l.draw(mousePoint);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue