niktof а как у вас получился такой маленький ответ? Ведь мы ищем минимум max(X+C;(A*A-X*X)^0,5;(B*B-(X+C)*(X+C))^0,5) по всем X принадлежащим отрезку [0,B-C], а max(X+C;(A*A-X*X)^0,5;(B*B-(X+C)*(X+C))^0,5) >= X+C >= C. Т.е. в худшем случае у вас может получиться корень из 2.
Добавлено спустя 1 час 21 минуту 49 секунд:
Да, извините niktof, я действительно ошибся. Может быть это вам поможет, хотя и здесь вполне может содержаться ошибка.
Совершенно очевидно, что если мы сможем вписать треугольник в какой-либо квадрат, то этот треугольник мы сможем расположить так, что одна из его вершин совпадет с вершиной квадрата. В принципе это хорошо доказывается по чертежу.
Далее перебираем все вершины треугольника. Если данная вершина имеет тупой угол, то пропускаем ее. Пусть мы сейчас рассматриваем некоторую вершину. Будем предполагать, что в требуемом квадрате треугольник можно расположить так, что рассматриваемая нами его вершина совпадет с вершиной квадрата. Т.к. мы перебираем все вершины и из-за сказанного выше, то хотя бы для одной вершины треугольника это будет верно. Пусть для рассматриваемой вершины это будет верно.
Теперь нарисуем угол квадрата и приложим наш треугольник так, что он будет лежать внутри этого угла и рассматриваемой нами вершина треугольника совпадет с вершиной угла квадрата. Повернем треугольник так, что одна из сторон треугольника смежных с рассматриваемой вершиной будет лежать на вертикальной стороне угла квадрата, и треугольник также будет лежать внутри угла квадрата. Будем вращать треугольник относительно рассматриваемой нами вершины до тех пор, пока другая его сторона смежная с рассматриваемой вершиной не будет лежать на горизонтальной стороне угла, естественно во время вращения треугольник не должен выходить за пределы угла. Для каждого положения треугольника мы будем строить минимальный квадрат, который содержит этот треугольник, и один из углов этого квадрата будет нарисованный нами угол. Из всех построенных квадратов выберем квадрат с минимальной стороной. Этот квадрат совпадет с требуемым квадратом, т.к. мы перебрали все возможные положения треугольника внутри угла квадрата.
Если же в требуемом квадрате треугольник нельзя расположить так, что рассматриваемая нами его вершина совпадет с вершиной квадрата, то тогда в конце наших действий мы получим квадрат, который будем больше требуемого.
Теперь насчет формулы. Обозначим вертикальную сторону угла квадрата за ось Y, горизонтальную за ось X (будем предполагать, что этот угол нарисован “правильно”).
Теперь координаты вершин треугольника имеют вид:
(0,0), (0,A), (sin(d)*B, cos(d)*B), где A – длина стороны треугольника, которая лежит на оси Y, B - длина другой стороны треугольника смежной с рассматриваемой нами вершиной, d – величина угла рассматриваемой нами вершины. Пусть треугольник повернулся на некоторый угол w по часовой стрелке. Тогда координаты его вершин запишутся так: (0,0) , (sin(w)*A,cos(w)*A) ,(sin(w+d)*B,cos(w+d)*B). Можно заметить, что треугольник окончит свое вращение, когда координата по оси Y его третей вершины станет равна нулю, т. е. cos(w+d)*B =0 => w= PI/2-d. В итоге w может изменяться от 0 до PI/2-d. Теперь для любого положения треугольника, сторона минимального квадрата, у которого один из углов совпадает с началом координат, будет вычисляться по следующей формуле –
max( 0 ; 0 ; sin(w)*A ; cos(w)*A ; sin(w+d)*B ; cos(w+d)*B ) = max(sin(w)*A ; cos(w)*A ; sin(w+d)*B ; cos(w+d)*B ).
В итоге получаем: найти минимум по всем w от 0 до PI/2-d от max(sin(w)*A ; cos(w)*A ; sin(w+d)*B ; cos(w+d)*B ) для каждой не “тупоуголной” вершины, и выбрать из этого минимум.
|