while (i1 < len(a1) && i2 < len(a2)) {
if (a1[i1] < a2[i2]) {
r[k++] = a1[i1];
} else {
r[k++] = a2[i2];
}
}
while (i1 < len(a1)) r[k++] = a1[i1];
while (i1 < len(a2)) r[k++] = a2[i2];
Перебираем вообще все всевозможные пути достижения цели.
var angle = ( vec_1.x * vec_2.x + vec_1.y * vec_2.y )/r*r;
var num = 1/(Math.cos(angle/2)*Math.sqrt(2+2*Math.cos(angle)))
1/(cos(a/2)*sqrt(2+2cos(a)) = 1/(1+cos(a))
. Внезапно сильно сократилось. И эта формула имеет смысл. Если нормали совпадают, то надо сдвинуться на вектор длины 1. А значит сумму двух нормалей надо будет поделить на 2. И действительно, при a=0, формула даст 1/2. Если нормали перпендикулярны, то они образуют квадрат со сдвинутыми сторонами и их сумма как раз даст диагональ. Надо домножить сумма на 1. Если же нормали прямо в разные стороны смотрят (a=180), то пересечение как-бы в бесконечности (стороны-то параллельны). И действительно, формула даст 1/0.
Потом, в текущей постановке, если могут быть пустые ячейки, то можно просто взять очень-очень мелкую сетку. Тогда каждая точка точно будет в отдельной клетке. Нужно или ограничить их с низу, или выбрать критерии. Может вам нужна сетка с максимальной площадью ячейки, если они все одинаковые должны быть.