Перебираем вообще все всевозможные пути достижения цели.
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.for (int i=0; i<n; ++i) {
b[i] = 0; // b - глобальный массив! Объявляйте его вне main()
for (int j=0; j<m; ++j) {
for (int p=j+1; p<m; ++p) {
if (a[i][j]==a[i][p]) ++b[i];
}
}
}
// в main() после ввода.
int rows[20];
for (int i=0; i<n; ++i) rows[i] = i;
// сортировке передаются первый элемент,
// элемент после последнего и компаратор -
// функция сравнения, которая проверяет, что первое
// значение должно идти раньше второго.
sort(rows, rows+n, &Cmp);
// теперь rows отсортирован. Выводим строки rows[0], rows[1]...
for (int i=0; i < n; ++i) {
for (int j=0; j<m; ++j) {
printf("%4d", a[rows[i]][j]);
}
printf("\n");
}
// Отдельная функция, описана перед main():
bool Cmp(const int &i, const int &j) {
return b[i] < b[j]; // тут обращаемся к глобальному массиву b.
}
Первый цикл выбирает меньгий эелемнт, пока есть оба массива. Далее остатки одного из двух массивов просто копируюутся в ответ.