JSFiddle - React, Tailwind, and code Playground
HTML
<canvas id="myCanvas" width="640" height="480"></canvas>
CSS
canvas {
display: block;
border: 1px solid;
}
JavaScript
var a = {x: 30, y: 50};
var b = {x: 300, y: 300};
var mousePos = {x: 0, y: 0};
var cvs = document.getElementById("myCanvas");
var ctx = cvs.getContext("2d");
var fillStyleDefault = "#000000";
var strokeStyleDefault = "#000000";
cvs.addEventListener("mousemove", function(e) {
mousePos = getMousePos(e);
}, false);
// ===========================
// получаем координаты мышки
// ===========================
function getMousePos(e) {
var rect = cvs.getBoundingClientRect();
return {
x: e.clientX - rect.left,
y: e.clientY - rect.top
};
}
// ===========================
// ===========================
// вспомогательные функции для рисования на канве
// ===========================
function clear() {
ctx.clearRect(0, 0, cvs.width, cvs.height);
}
function drawDot(p, color) {
ctx.fillStyle = color;
ctx.beginPath();
ctx.arc(p.x, p.y, 5, 0, 2 * Math.PI);
ctx.fill();
ctx.fillStyle = fillStyleDefault;
}
function drawLine(p1, p2, color) {
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(p1.x, p1.y);
ctx.lineTo(p2.x, p2.y);
ctx.closePath();
ctx.stroke();
ctx.strokeStyle = strokeStyleDefault;
}
function drawVector(from, v, color) {
var p1 = from;
var p2 = {
x: from.x + v.x,
y: from.y + v.y
};
drawLine(p1, p2, color);
}
// ===========================
// ===========================
// векторная математика
// ===========================
// длина вектора v
function len(v) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
// скалярное произведение векторов v1 и v2
function dot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y;
}
// нормализация вектора v
// (получение вектора с длиной 1 - единичного вектора, направленного в ту же сторону)
function unit(v) {
var vl = len(v);
var ret = {x: 0, y: 0};
if (vl > 0) {
ret = {
x: v.x / vl,
y: v.y / vl
};
}
return ret;
}
// умножение вектора v на скаляр s
function mult(v, s) {
return {
x: v.x * s,
y: v.y * s
...