Я уже тут когда-то писал о том, что довольно часто ощущаю недостаток школьного образования. Вот не так давно (около двух лет назад), например, понадобилось нарисовать эллипс жирной пунктирной линией. Казалось бы, всё довольно просто: есть метод Ellipse, можно выбрать Canvas.Pen.Style:= psDash; Canvas.Pen.Width:= 3; и вперёд! Но не всё так просто
(
Read more... )
Одно решение - деление на равные угловые сектора, нечётным секторам соответствует штрих, чётным - промежуток. Здесь полярные координаты очень даже помогают. Длины штрихов получаются, конечно, разные, но не настолько разные, как расстояние между соседними точками при параметрическом задании эллипса. При a/b=2 длины штрихов тоже отличаются в два раза. И на глаз это выглядит как-то логичнее, когда вблизи центра штрихи получаются короткие, а вдали - длинные, а не наоборот.
Второе решение - задание длины штриха, обратно пропорциональной радиусу эллипса в данной точке. Выглядит некрасиво, т.к. поддерживается примерно постоянной длина штриха, а длина промежутка между ними сильно гуляет (положения центров штрихов выбираются также исходя из деления круга на равные угловые сектора). Кроме того и в таком случае не все штрихи одинаковой длины, длинные штрихи получаются там, где касательная к эллипсу не перпендикулярна радиусу, т.е. на пути от точки с малым радиусом к точке с большим радиусом и наоборот.
И вот по прошествии двух лет решил вернуться к этой праздной задаче и сделать третий вариант, когда длина штриха не только обратно пропорциональна мгновенной длине радиус-вектора, но и прямо пропорциональна косинусу угла между касательной и прямой, перпендикулярной радиусу. Сделал. Отличия от предыдущего варианта очень незначительные, иногда и не угадаешь, какой вариант перед глазами.
Периметр эллипса - эллиптический интеграл. В элементарных функциях не выражается. Не то, чтобы это сильно озадачивало, но есть ли смысл? Пока для практических нужд (а я уже забыл, в чём была практическая нужда) удовлетворился первым вариантом. А, вспомнил! Мне нужно было нарисовать пунктирную окружность! Но для общности стал разрабатывать процедуру построения эллипса. :)
Reply
Leave a comment