let v1 = normalizeVector({ x: p.x - prevPoint.x, y : p.y - prevPoint.y });
let v2 = normalizeVector({ x: nextPoint.x - p.x, y : nextPoint.y - p.y });
k = v1.x * v2.y - v1.y * v2.x;
if (k < 0){
//the angle is greater than pi, invert outgoing,
//ready to get interior bisector
v2 = multiply(v2, -1);
}
else{
//the angle is less than pi, invert incoming,
v1 = multiply(v1, -1);
}
bisector = normalizeVector({ x: v1.x + v2.x, y : v1.y + v2.y });
Etit: Вот еще более быстрый код для генерации внутреннего биссектриса без использования каких-либо нормалей: код Matlab, который я тестировал.Он генерирует единичные биссектрисы, указывающие внутри многоугольника.
function B = bisectors(P)
%P is 2 x n matrix, column P(:,j) is a vertex of a polygon in the plane,
%P is the ordered set of vertices of the polygon
[~,n] = size(P);
B = zeros(2,n);
for j=1:n
if j == 1
v_in = P(:,1) - P(:,n);
v_out = P(:,2) - P(:,1);
elseif j == n
v_in = P(:,j) - P(:,j-1);
v_out = P(:,1) - P(:,j);
else
v_in = P(:,j) - P(:,j-1);
v_out = P(:,j+1) - P(:,j);
end
v_in = v_in/sqrt(v_in'*v_in); %normalize edge-vector
v_out = v_out/sqrt(v_out'*v_out); %normalize edge-vector
% bisector of the complementary angle at the vertex j,
% pointing counter clockwise and displacing the vertex so that
% the resulting polygon is 1 unit inwards in normal direction:
bisector = v_in + v_out;
bisector = bisector/abs(bisector'*v_in);
% 90 degree counter clockwise rotation of complementary bisector:
B(1,j) = - bisector(2);
B(2,j) = bisector(1);
end
end
И в вашей записи:
function getBisector(prevPoint, point, nextPoint) {
let v1 = normalizeVector({ x : point.x - prevPoint.x, y : point.y - prevPoint.y });
let v2 = normalizeVector({ x : nextPoint.x - point.x, y : nextPoint.y - point.y });
let bisectorPerp = addVectors(v1, v2);
bisectorPerp = bisectorPerp / absoluteValue(dot(v1, bisectorPerp));
return {x : - (bisectorPerp.y), y : bisectorPerp.x};
}
Эта функция возвращает биссектрисы той же длины, что и в вашей последней функции, без необходимости использования дополнительной функции getIntersection.