Здравствуйте . Есть задачка по поиску точек выпуклости -
https://www.codewars.com/kata/5657d8bdafec0a27c800... . Для решения задачи хочу использовать алгоритм Джарвиса -
https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...
Код :
https://codesandbox.io/s/awesome-fast-irxqu?file=/...
const hullMethod = (points) => {
const [oPoint, ...restPoints] = points;
const hull = [oPoint];
const angelsObj = {
angle: 0,
x: 0,
y: 0
};
// p2 point search by polar angel
restPoints.forEach((point) => {
const [x, y] = point;
const angle = (Math.atan(y / x) * 180) / Math.PI;
if (angelsObj.angle > angle) {
[angelsObj.angle, angelsObj.x, angelsObj.y] = [angle, x, y];
} else if (angelsObj.angle === 0) {
[angelsObj.angle, angelsObj.x, angelsObj.y] = [angle, x, y];
}
});
// searching other points by cos of angle
points.forEach(([curX, curY]) => {
let nextVector = [curX - angelsObj.x, curY - angelsObj.y];
const cosAngle =
(angelsObj.x * nextVector[0] + angelsObj.y * nextVector[1]) /
Math.sqrt(
Math.pow(angelsObj.x, 2) * Math.pow(nextVector[0], 2) +
Math.pow(angelsObj.y, 2) * Math.pow(nextVector[1], 2)
);
console.log(curX, curY, cosAngle);
});
};
hullMethod([
[0, 0],
[5, 3],
[0, 5],
[2, 3]
]);
//expected = [[0, 0], [0, 5], [5, 3]]
Функция нормально определяет вторую точку по полярному углу , но я не знаю как проверять слудующие точки через косинус скалярного произведениея. Как написать более оптимальную реализацию алгоритма ?