Не так много ... просто основы c тригонометрия
class Shape {
constructor(ctx, coord) {
this.ctx = ctx;
this.coord = coord;
let v = {
x: coord[1].x - coord[0].x,
y: coord[1].y - coord[0].y
}
this.angle = Math.atan2(v.y, v.x)
}
drawLine(coord, color) {
this.ctx.beginPath();
this.ctx.moveTo(coord[0].x, coord[0].y);
this.ctx.lineTo(coord[1].x, coord[1].y);
this.ctx.strokeStyle = color;
this.ctx.stroke();
}
draw(pos) {
this.drawLine(this.coord, "black");
var x = pos.x + 200 * Math.cos(this.angle + Math.PI / 2)
var y = pos.y + 200 * Math.sin(this.angle + Math.PI / 2)
this.drawLine([{x,y,}, pos], "red");
}
}
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
shape = new Shape(ctx, [{x: 0,y: 50}, {x: 200,y: 100}])
shape.draw({x: 100,y: 0})
canvas.addEventListener('mousemove', function(evt) {
var mousePos = getMousePos(canvas, evt);
ctx.clearRect(0, 0, canvas.width, canvas.height)
shape.draw(mousePos);
}, false);
<canvas id="c" width=200 height=160 style="border:2px solid #a7a4a4;"></canvas>
Учитывая две точки, мы можем вычислить угол:
this.angle = Math.atan2(v.y, v.x)
Тогда, если мы добавим 90 градусов или в радианах (Math .PI / 2) это угол перпендикулярной линии.
В вопросе неясно, где должна быть перпендикулярная линия (p3), поэтому я сделал это относительно мыши, если вы запустите сниппет и наведете указатель мыши на холст, вы должны увидеть линию от мыши Положение вниз.
Я использовал HTML canvas, но то же самое можно применить к любому другому холсту.