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
 ...