Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Рисование наклонного эллипса... |
Автор: CyraxZ 17.3.2007, 00:45 |
1. Метод DrawEllipse рисует прямой эллипс. Как нарисовать наклонный эллипс ? 2. Не совсем понятна ситуация с методом GraphicsPath.AddEllipse(...). При добавлении эллипса, как я понимаю, добавляются 2 точки - углы прямоугольника, в который вписан эллипс. После rotate'а GraphicsPath'а эти точки меняют расположение и становятся углами наклонного прямоугольника, в который вписан эллипс (теперь уже тоже наклонный). а) в какой последовательности извсекаются угловые точки прямоугольника из объекта GraphicsPath - в порядке стека или очереди ? б) что делать с угловыми точками прямоугольника, в который вписан эллипс, после rotate'а объекта GraphicsPath - с их помощью уже не нарисуешь эллипс - информации об угле наклона то нет... Т.е. (в случае, если наряду с размещёнными в GraphicsPath точками размещается информация об объекте (в случае с эллипсом - угол его наклона, т.к. две новые точки (после вращения) не задают однозначно наклонный эллипс)) нарисовать наклонённый эллипс можно будет только с использованием объекта GraphicsPath, а не по точкам и другим параметрам (а таковые оттуда извлечь нельзя, кроме новых точек)... |
Автор: Idsa 17.3.2007, 03:00 | ||
1. Для подобных операций нужно использовать матрицы преобразований. В частности, для поворота эллипса подойдет вот этот код:
|
Автор: mr.DUDA 17.3.2007, 11:23 |
2. Трансформации не влияют на исходные координаты, так что если сделать как правильно советует Idsa, можно продолжать работать в "обычной" прямоугольной системе координат, всё будет поворачиваться автоматически. |
Автор: CyraxZ 17.3.2007, 20:10 | ||
Это если Graphics трансформировать... Но если эллипс в GraphicsPath загонять и трансформировать - там уже координаты эллипса должны меняться... |
Автор: CyraxZ 21.3.2007, 23:47 |
Задача состоит в следующем: 1. Определить минимальный набор параметров, однозначно задающих эллипс на плоскости. 2. После трансформации эллипса (поворот, перемещение, масштабирование, отражение (flip)) необходимо получить новый набор описывающих его параметров. Так вот, за минимальный набор параметров можно взять две диагональные точки прямоугольника, в который вписан эллипс, и угол его наклона (итого 5 чисел). Теперь, если проводить трансформацию эллипса (прежде всего интересует поворот и отражение (flip)) путём соответствующей предварительной трансформации объекта Graphics, куда выводится эллипс, то мы не получим новых параметров эллипса. Ну, с поворотом проблем не возникнет - увеличили угл эллипса на угол поворота и всё... Но в случае масштабирования (в общем случае - относительно произвольной прямой) наклонного эллипса возникнут проблемы. На Graphics то мы выведем отмасштабированный эллипс (перемещение, поворот, scale на (-1), обратный поворот, обратное перемещение). Но для получения новых параметров эллипса (а в этом случае изменятся все параметры эллипса - и углы прямоугольника, и угол наклона эллипса) придётся провести нехилые ручные мат. операции... Нужно же реализовать 2-й пункт, не прибегая к ручной трансформации (т.е. не высчитывать самостоятельно новые точки и другие параметры)... Если проводить трансформацию эллипса с помощью объекта GraphicsPath (GraphicsPath.AddEllipse(4 параметра - углы прямоугольника, в который вписан эллипс) и GraphicsPath.RotateTransform(...) или другие методы для трансформации), то в случае, например, вращения получим угловые точки наклонного прямоугольника, которые никакой информации нам не дадут: X1 = graphicsPath.PathPoints[0].X; Y1 = graphicsPath.PathPoints[0].Y; X2 = graphicsPath.PathPoints[1].X; Y2 = graphicsPath.PathPoints[1].Y; угол-то не известен... |
Автор: CyraxZ 22.3.2007, 10:19 |
Ну и такой вопрос: после graphicsPath.AddEllipse(X1, Y1, X2, Y2) какие ещё параметры об эллипсе хранит этот объект (graphicsPath) кроме переданных точек и как их получить ?.. |
Автор: CyraxZ 23.3.2007, 10:40 |
Naum, по двум диагональным точкам прямоугольника можно построить бесконечное множество прямоугольников с разными углами наклона... Поэтому, объект graphicsPath кроме этих двух диагональных точек должен хранить ещё какую-то информацию об эллипсе, скажем, угол его наклона... |
Автор: Naum 23.3.2007, 10:45 | ||
Да уж, че-то я не подумал. Тады я прошу прощения и умываю руки. ![]() |
Автор: CyraxZ 1.4.2007, 20:37 |
Скажем, эллипс хранится в виде следующих параметров: 1. Верхняя левая точка прямоугольника, в который вписан эллипс 2. Нижняя правая точка прямоугольника, в который вписан эллипс 3. Угол наклона эллипса Эти параметры однозначно задают положение и размеры эллипса на плоскости. Как теперь проводить трансформацию эллипса, чтобы каждый раз получать новые значения указанных параметров ? Скажем, растянуть по горизонтали (scale) наклонный эллипс... Главный вопрос: можно ли трансформировать эллипс и получать его новые параметры с помощью объекта GraphicsPath ? |
Автор: CyraxZ 9.4.2007, 22:16 |
Всё, разобрался, GraphicsPath при запихивании в него эллипса формирует 13 точек (почему именно 13 - не понятно), расположенных на этом эллипсе. Трансформации подвергаются как раз эти точки, а не параметры эллипса... Поэтому обратно получить новые параметры эллипса не удасться (из новых 13 точек получить эллипс - вручную - довольно трудоёмко)... Проще всего работать с прямоугольником, в который вписывается эллипс. Соответственно, трансформации в GraphicsPath будут подвергаться угловые точки этого прямоугольника... Единственная ручная работа - по 4-м точкам произвольно наклонённого прямоугольника (который описывает эллипс) получить соразмерный горизонтальный прямоугольник и угол наклона прямоугольника/эллипса (если за набор параметров, однозначно описывающих эллипс на плоскости, взять описывающий эллипс горизонтальный прямоугольник и угол его наклона относительно горизонтали (а этот набор параметров пока самый оптимальный для вывода на объект graphics - поворот системы координат на угол наклона описывающего эллипс прямоугольника, DrawEllipse и обратный поворот))... |
Автор: teesync 26.7.2022, 21:38 |
Модератор: Сообщение скрыто. |
Автор: squilia 15.8.2022, 02:28 |
Модератор: Сообщение скрыто. |