Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование наклонного эллипса... 
:(
    Опции темы
CyraxZ
Дата 17.3.2007, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



1. Метод DrawEllipse рисует прямой эллипс. Как нарисовать наклонный эллипс ?
2. Не совсем понятна ситуация с методом GraphicsPath.AddEllipse(...). При добавлении эллипса, как я понимаю, добавляются 2 точки - углы прямоугольника, в который вписан эллипс. После rotate'а GraphicsPath'а эти точки меняют расположение и становятся углами наклонного прямоугольника, в который вписан эллипс (теперь уже тоже наклонный).
а) в какой последовательности извсекаются угловые точки прямоугольника из объекта GraphicsPath - в порядке стека или очереди ?
б) что делать с угловыми точками прямоугольника, в который вписан эллипс, после rotate'а объекта GraphicsPath - с их помощью уже не нарисуешь эллипс - информации об угле наклона то нет... Т.е. (в случае, если наряду с размещёнными в GraphicsPath точками размещается информация об объекте (в случае с эллипсом - угол его наклона, т.к. две новые точки (после вращения) не задают однозначно наклонный эллипс)) нарисовать наклонённый эллипс можно будет только с использованием объекта GraphicsPath, а не по точкам и другим параметрам (а таковые оттуда извлечь нельзя, кроме новых точек)...
PM MAIL   Вверх
Idsa
Дата 17.3.2007, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



1. Для подобных операций нужно использовать матрицы преобразований. В частности, для поворота эллипса подойдет вот этот код:
Код

private void Form1_Paint(object sender, PaintEventArgs e)
    {
      e.Graphics.RotateTransform(30f, MatrixOrder.Append);
      e.Graphics.DrawEllipse(new Pen(Color.Blue, 3), 100, 00, 200, 80);
    }



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 17.3.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



2. Трансформации не влияют на исходные координаты, так что если сделать как правильно советует Idsa, можно продолжать работать в "обычной" прямоугольной системе координат, всё будет поворачиваться автоматически.


--------------------
user posted image
PM MAIL WWW   Вверх
CyraxZ
Дата 17.3.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Цитата

Трансформации не влияют на исходные координаты

Это если Graphics трансформировать... Но если эллипс в GraphicsPath загонять и трансформировать - там уже координаты эллипса должны меняться...
PM MAIL   Вверх
CyraxZ
Дата 21.3.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Задача состоит в следующем:
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;
угол-то не известен...
PM MAIL   Вверх
CyraxZ
Дата 22.3.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Ну и такой вопрос: после graphicsPath.AddEllipse(X1, Y1, X2, Y2) какие ещё параметры об эллипсе хранит этот объект (graphicsPath) кроме переданных точек и как их получить ?..
PM MAIL   Вверх
Naum
Дата 22.3.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



 smile 
Не совсем вкурил задачу точнее совсем не вкурил
Но я не понял сложности последнего
Цитата(CyraxZ @  22.3.2007,  00:47 Найти цитируемый пост)
X1 = graphicsPath.PathPoints[0].X;Y1 = graphicsPath.PathPoints[0].Y;X2 = graphicsPath.PathPoints[1].X;Y2 = graphicsPath.PathPoints[1].Y;угол-то не известен...
,
зная две точки, узнать угол относительно горизонтальной или вертикальной оси как два байта переслать. тем более во вторм фреймворке у класса Math появился метод Atan2(double x, double y)



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
CyraxZ
Дата 23.3.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Naum, по двум диагональным точкам прямоугольника можно построить бесконечное множество прямоугольников с разными углами наклона...
Поэтому, объект graphicsPath кроме этих двух диагональных точек должен хранить ещё какую-то информацию об эллипсе, скажем, угол его наклона...
PM MAIL   Вверх
Naum
Дата 23.3.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(CyraxZ @  23.3.2007,  11:40 Найти цитируемый пост)
по двум диагональным точкам прямоугольника можно построить бесконечное множество прямоугольников с разными углами наклона

Да уж, че-то я не подумал. Тады я прошу прощения и умываю руки. smile 



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
CyraxZ
Дата 1.4.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Скажем, эллипс хранится в виде следующих параметров:
1. Верхняя левая точка прямоугольника, в который вписан эллипс
2. Нижняя правая точка прямоугольника, в который вписан эллипс
3. Угол наклона эллипса
Эти параметры однозначно задают положение и размеры эллипса на плоскости.

Как теперь проводить трансформацию эллипса, чтобы каждый раз получать новые значения указанных параметров ?
Скажем, растянуть по горизонтали (scale) наклонный эллипс...

Главный вопрос: можно ли трансформировать эллипс и получать его новые параметры с помощью объекта GraphicsPath ?
PM MAIL   Вверх
CyraxZ
Дата 9.4.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Всё, разобрался, GraphicsPath при запихивании в него эллипса формирует 13 точек (почему именно 13 - не понятно), расположенных на этом эллипсе. Трансформации подвергаются как раз эти точки, а не параметры эллипса... Поэтому обратно получить новые параметры эллипса не удасться (из новых 13 точек получить эллипс - вручную - довольно трудоёмко)...

Проще всего работать с прямоугольником, в который вписывается эллипс. Соответственно, трансформации в GraphicsPath будут подвергаться угловые точки этого прямоугольника...

Единственная ручная работа - по 4-м точкам произвольно наклонённого прямоугольника (который описывает эллипс) получить соразмерный горизонтальный прямоугольник и угол наклона прямоугольника/эллипса (если за набор параметров, однозначно описывающих эллипс на плоскости, взять описывающий эллипс горизонтальный прямоугольник и угол его наклона относительно горизонтали (а этот набор параметров пока самый оптимальный для вывода на объект graphics - поворот системы координат на угол наклона описывающего эллипс прямоугольника, DrawEllipse и обратный поворот))...
PM MAIL   Вверх
teesync
Дата 26.7.2022, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 26.7.2022

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
squilia
Дата 15.8.2022, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 15.8.2022

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1532 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.