Für alle, die es interessiert, @TomP fragte nach einer js-Version, so hier ist eine javascript-Version, die ich gemacht. Sie basiert auf den Antworten von @Patratacus und @Marcelo Cantos. Javascript unterstützt keine Operatorüberladung, daher ist es nicht so sauber wie C++ oder andere Sprachen. Sie können gerne Verbesserungen vorschlagen.
Ich verwende Class.js, um Klassen zu erstellen.
Vector = Class.extend({
NAME: "Vector",
init: function(x, y)
{
this.x = x;
this.y = y;
},
subtract: function(v1)
{
return new Vector(this.x - v1.x, this.y - v1.y);
},
add: function(v1)
{
return new Vector(this.x + v1.x, this.y + v1.y);
},
divide: function(number)
{
return new Vector(this.x / number, this.y / number);
},
multiply: function(number)
{
return new Vector(this.x * number, this.y * number);
},
length: function()
{
var distance;
distance = (this.x * this.x) + (this.y * this.y);
return Math.sqrt(distance);
}
});
Und dann eine Funktion, die die Logik ausführt:
var getArrowhead = function(A, B)
{
var h = 10 * Math.sqrt(3);
var w = 5;
var v1 = B.subtract(A);
var length = v1.length();
var U = v1.divide(length);
var V = new Vector(-U.y, U.x);
var r1 = B.subtract(U.multiply(h)).add(V.multiply(w));
var r2 = B.subtract(U.multiply(h)).subtract(V.multiply(w));
return [r1,r2];
}
Und rufen Sie die Funktion wie folgt auf:
var A = new Vector(start.x,start.y);
var B = new Vector(end.x,end.y);
var vec = getArrowhead(A,B);
console.log(vec[0]);
console.log(vec[1]);
Ich weiß, dass der OP nicht nach einer bestimmten Sprache gefragt hat, aber ich bin auf der Suche nach einer JS-Implementierung darauf gestoßen, also dachte ich, ich würde das Ergebnis posten.