Ещё один вопрос по массивам назрел. Скажем у меня есть матрица 5 на 5, допустим такая:
1 6 8 4 9
5 3 9 4 5
9 3 7 5 1
0 0 8 6 6
6 7 2 0 4
И скажем с клавиатуры я задаю 4 строку и 2 столбец. При этом 4 строка должна поменяться местами со 2ым столбцом. Т.е. новая матрица должна выглядеть так (там где знак вопроса может стоять любая цифра, например 100):
void Matrix3x3_Transpose( matrix3x3 out, const matrix3x3 in )
2
{
3
out[0][0] = in[0][0];
4
out[1][0] = in[0][1];
5
out[2][0] = in[0][2];
6
out[0][1] = in[1][0];
7
out[1][1] = in[1][1];
8
out[2][1] = in[1][2];
9
out[0][2] = in[2][0];
10
out[1][2] = in[2][1];
11
out[2][2] = in[2][2];
12
}
Операция называется транспонированием матрицы (если конечно надо все ячейки поменять, а не только одну).
Операция достаточно ответственная, поэтому в цикле её лучше не делать, чтобы потом не гадать отчего всё глючит.
Если одну ячейку - то принцип тот же.
Добавлено 08-11-2010 в 23:11:
ЗЫ. Для твоего примера вышеприведенный код будет выглядеть приблизительно вот так:
C++ Source Code:
1
matrix3x3 tmp;
2
int row= 1, column=2;
3
memcpy( tmp, mat, sizeof( matrix3x3 ));
4
mat[row][0] = tmp[0][column];
5
mat[row][1] = tmp[1][column];
6
mat[row][2] = tmp[2][column];
Что-то типа того. Но надо как следует разобраться где у тебя строки. а где столбцы, то есть скорее тест на внимательность, нежели на умение кодить.
DEAD MAN тебе для удобства надо функцию завести, которая будет свапать выбранную строку и столбец, и вынести туда код, по типу того что я привёл. Тогда не запутаешься: получаешь из консоли строку, столбец, кормишь их функции, она сама всё свапает. А в одном майне и запутаться недолго.
Пользователь вводит координаты некой четырёхугольной фигуры. Программа должна сказать по этим точкам является ли фигура прямоугольником.
Проблема в том, что я понимаю как это надо делать: найти углы между векторами, найти длину векторов и сравнить противоположные стороны(если конечно они параллельны). Но тут возникает 2 проблемы. Тонны переменных, которые меня несколько напрягают(поскольку вводить координаты надо для 3ёх разных фигур) . И честность пользователя, будет ли он вводить координаты по часовой стрелке, или в случайном порядке, т.к. во втором случаи понятия не имею для каких векторов находить углы и длины.
В общем, есть ли более простой способ решения задачи?
Кирпичами не кидайтесь. %)
Я бы всю фигуру передвинул бы в начало кооординат одной точкой и 2 раза повернул бы вокруг этой первой точки так, что бы сначала эта первая точка и, например, 2-я легли на одну ось и затем ещё раз, что бы уже 1 и 3-я опять же легли на одну ось.
Осталось бы за эти 2 поворота сравнить координаты точек, у прямоугольника будут по 2 парные точки с одинаковыми координатами по одной из осей за один из 2х вариантов поворота.
Я бы так сделал:
1) Нашел бы верхнюю левую точку.
2) Нашел бы верхнюю правую точку.
3) Нашел бы нижнюю левую точку.
4) Нашел бы нижнюю правую точку.
5) Сравнил бы X левой верхней и левой нижней точек.
6) Сравнил бы X правой верхней и правой нижней точек.
7) Сравнил бы Y левой верхней и правой верхней точек.
8) Сравнил бы Y левой нижней и правой нижней точек.
И если либо в 5, либо в 6, либо в 7, либо в 8 получаются не равные результаты, значит фигура - не прямоугольник.
__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов
DEAD MAN координаты должны вводиться только по часовой или только против часовой стрелки. Потом поверяешь противоположные стороны на равенство и один (любой) из углов на равенство 90° (результат скалярного произведения векторов-сторон должен быть равен 0).
это да, я сходу не вспомнил чему косинус 90 градусов равняется
__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов
Надо заюзать RotatePointAroundVector, построить четырёхугольник завращать вокруг центра, визуализировать его и вывести диалог для юзера: Эта фигура является прямоугольником? Да\Нет.