public static getAnglePoint(p0: { x: number, y: number }, p1: { x: number, y: number }, range: number): { x: number, y: number } {
if (p1.y == p0.y) {
return { x: Math.floor((p0.x + p1.x) / 2), y: p1.y - range };
}
else if (p1.x == p0.x) {
return { x: p1.x + range, y: Math.floor((p0.y + p1.y) / 2) };
}
var k1 = (p1.y - p0.y) / (p1.x - p0.x);
var b1 = p1.y - k1 * p1.x;
var k = -1 / k1;
var x = (p0.x + p1.x) / 2;
var y = (p0.y + p1.y) / 2;
var b = y - k * x;
var nx1 = 0, ny1 = 0;
var nx2 = 0, ny2 = 0;
var fa = Math.pow(k,2) + 1;
var fb = 2 * k * (b - y) - 2 * x;
var fc = Math.pow(x, 2) + Math.pow(b - y, 2) - Math.pow(range, 2);
nx1 = (-fb + Math.sqrt(Math.pow(fb, 2) - 4 * fa * fc))/(2 * fa);
ny1 = k * nx1 + b;
nx2 = (-fb - Math.sqrt(Math.pow(fb, 2) - 4 * fa * fc))/(2 * fa);
ny2 = k * nx2 + b;
if (p1.y >= p0.y) {
return { x: Math.floor(nx1), y: Math.floor(ny1) };
}
return { x: Math.floor(nx2), y: Math.floor(ny2) };
}