Хорошо, поэтому первый ответ на этой странице мне очень помог, когда я пытался сам разобраться в этой проблеме, хотя, как уже сказал кто-то другой, если у вас ширина линии больше 1px, вы получите забавные формы. Исправление, предложенное кем-то еще, почти сработало, но у меня все еще были некоторые проблемы при попытке использовать стрелку с большей шириной. После нескольких часов игры с ним я смог объединить вышеупомянутое решение с некоторыми из моих собственных задач, чтобы придумать следующий код, который нарисует стрелку любой толщины, которую вы пожелаете, не искажая форму стрелки.
function drawArrow(fromx, fromy, tox, toy){
//variables to be used when creating the arrow
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var headlen = 10;
var angle = Math.atan2(toy-fromy,tox-fromx);
//starting path of the arrow from the start square to the end square and drawing the stroke
ctx.beginPath();
ctx.moveTo(fromx, fromy);
ctx.lineTo(tox, toy);
ctx.strokeStyle = "#cc0000";
ctx.lineWidth = 22;
ctx.stroke();
//starting a new path from the head of the arrow to one of the sides of the point
ctx.beginPath();
ctx.moveTo(tox, toy);
ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/7),toy-headlen*Math.sin(angle-Math.PI/7));
//path from the side point of the arrow, to the other side point
ctx.lineTo(tox-headlen*Math.cos(angle+Math.PI/7),toy-headlen*Math.sin(angle+Math.PI/7));
//path from the side point back to the tip of the arrow, and then again to the opposite side point
ctx.lineTo(tox, toy);
ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/7),toy-headlen*Math.sin(angle-Math.PI/7));
//draws the paths created above
ctx.strokeStyle = "#cc0000";
ctx.lineWidth = 22;
ctx.stroke();
ctx.fillStyle = "#cc0000";
ctx.fill();
}
Теперь это код, который я использую в своей программе. Я обнаружил, что ключом к устранению проблемы искажения было продолжение хода от кончика стрелки к одной боковой точке, к другой боковой точке, обратно к кончику и обратно к первой боковой точке, затем выполняем заполнить. Это исправило форму стрелки.
Надеюсь, это поможет!