uvelichitel: Оптимальность по числу транспозиций - могу. Достаточно проверить, что при транспозиции двух элементов число циклов в перестановке изменяется ровно на 1 (если элементы, стоящие на своём месте считать за цикл длины 1). В алгоритме, если очередной элемент L1[i] принадлежит циклу длины k, то все элементы этого цикла встанут на место за k-1 транспозицию. В итоге получается, что нужно N-M транспозиций, где M - число циклов. Это оптимальная величина.
Да, (x,y,z) - направление оси поворота. Длина этого вектора, правда, обычно меньше 1, а для "вектора оси" чаще используют единичный вектор. Так что, возможно, придётся поделить вектор (x,y,z) на его длину.
Перемножение кватернионов аналогов не имеет. Если у нас есть два кватерниона (v1,w1) и (v2,w2) (здесь v1, v2 - векторы (x1,y1,z1) и (x2,y2,z2) соответственно), то их произведение будет кватернионом
(v1*w2+v2*w1+[v1,v2],w1*w2-(v1,v2)), где [v1,v2] - векторное произведение двух векторов, а (v1,v2) - скалярное произведение.
mayorovp: Переводом строки решил отделять не автор, а проверяющий. Для экономии времени он вполне может не дожидаться подсказок, а ввести сразу все данные. У меня довольно обычным делом было при проверке программы с кодом
printf("x=");
scanf("%lf",&x);
printf("y=");
scanf("%lf",&y);
printf("z=");
scanf("%lf",&z);
на первую подсказку вводить сразу все координаты.
Армянское Радио: Стоит ли использовать библиотеки, когда легко обойтись без них? scanf("%d",&n) запоминается и пишется гораздо проще, чем любой библиотечный вызов. Конечно, он неустойчив к ошибкам, но в упражнениях предполагается, что проверяющий ошибок не делает.
mayorovp: А зачем %*c ? %d замечательно проглотит все пробелы и переводы строки. Правда, разница будет, если на Enter the cod of worker ввести, скажем, 1580. В коде автора 580 будет воспринято, как зарплата, а при вводе кода по %d - 1580 воспримется, как код, и программа ругнётся. Лучше использовать scanf("%1d",&cod);
Артем Иванцов: Если команда добавится между проверкой в цикле, что очередь пуста, и реакцией на эту ситуацию, то будет плохо.
Цикл: проверяю: очередь пуста.
AddCommand: смотрю: цикл не спит. Добавляю команду в очередь. Событие не дёргаю.
Цикл: сообщаю, что лёг спать и иду ждать события.
И теперь передача команды будет отложена, пока не придёт следующая команда. Хорошо, если это случится быстро.
Urukhayy: Нет, dx, dy по модулю не должно влиять. Там знак не важен. Он важен при вычислении PR.
Про формулу - вряд ли я смогу ответить. Не гуглил точно. Но помнил, или вывел на лету - не скажу. Запоминать такие формулы необходимости нет, достаточно знать принципы, которые там работают. А когда надо, превращать их в нужные формулы.
Артем Иванцов: Думаю, что если событие "поднято", то первый WaitOne заканчивается сразу. И для вашей задачи это очень важно: если AddCommand вклинится между установкой флага "я сплю" и самим WaitOne, то нужно тут же проснуться и отработать команду.
Urukhayy: Нет, косинус был бы, если бы скалярное произведение делили на произведение длин векторов. А так его делят на квадрат длины одного вектора. Эта величина названия не имеет.
(dx,dy) - это не точка, а вектор AX. Где X - ближайшая к A точка отрезка BC. Вычисляется как сумма векторов AB=(x1-x,y1-y) и BX=cf*BC=(cf*(x2-x1),cf*(y2-y1)).
Urukhayy: cf=fmax(0,fmin(1,PR/L)); - это значит, что cf всегда меньше 1 и больше 0?
Не только. Значит, что значения, большие 1, мы превращаем в 1, а значения, меньшие 0 - превращаем в 0. А остальные не меняем. Но на выходе действительно будет число от 0 до 1 (включительно).
Учитесь разбирать формулы и понимать, что в них написано - пригодится :) Математика - это язык. На котором вполне можно читать без словаря.
Urukhayy:
LPerp - это расстояние от точки до прямой? - да
fabs - модуль числа? - да
и откуда взялась нижняя формула?
Площадь параллелограмма с вершинами (0,0), (x1,y1), (x1+x2,y1+y2), (x2,y2) можно вычислить как
abs(x1*y2-x2*y1). Это часть формулы векторного произведения двух векторов в трёхмерном пространстве, которое, в частности, позволяет найти площадь параллелограмма и активно используется при вычислении площадей и нормалей к поверхности. Треугольник - половина параллелограмма, так что его удвоенная площадь вычисляется по той же формуле. Если начало не в (0,0), то из координат двух вершин надо вычитать координату третьей.
во всех ли C подобных языках действует синтаксис res=(PR >= 0 && PR <= L);? - насколько я знаю, да.
Откуда Вы знаете формулы?) Домашнее обучение, или Вы профессор какой?) - нет, до профессора не дорос. Был всего лишь ведущим научным сотрудником мехмата... А вообще, да - домашнее обучение. В рамках подготовки к международной олимпиаде пришлось и не такое узнать.
Но конкретно эти формулы изучаются на первом курсе, на аналитической геометрии. Чтобы знать их, профессором быть не обязательно.
Urukhayy: Так если расстояние, то это не всегда перпендикуляр, а расстояние до ближайшей точки. Которая может быть как основанием перпендикуляра, так и одним из концов отрезка. Вы уж определитесь, какая у вас задача :)
Расстояние ищется так: