![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
1. Метод DrawEllipse рисует прямой эллипс. Как нарисовать наклонный эллипс ?
2. Не совсем понятна ситуация с методом GraphicsPath.AddEllipse(...). При добавлении эллипса, как я понимаю, добавляются 2 точки - углы прямоугольника, в который вписан эллипс. После rotate'а GraphicsPath'а эти точки меняют расположение и становятся углами наклонного прямоугольника, в который вписан эллипс (теперь уже тоже наклонный). а) в какой последовательности извсекаются угловые точки прямоугольника из объекта GraphicsPath - в порядке стека или очереди ? б) что делать с угловыми точками прямоугольника, в который вписан эллипс, после rotate'а объекта GraphicsPath - с их помощью уже не нарисуешь эллипс - информации об угле наклона то нет... Т.е. (в случае, если наряду с размещёнными в GraphicsPath точками размещается информация об объекте (в случае с эллипсом - угол его наклона, т.к. две новые точки (после вращения) не задают однозначно наклонный эллипс)) нарисовать наклонённый эллипс можно будет только с использованием объекта GraphicsPath, а не по точкам и другим параметрам (а таковые оттуда извлечь нельзя, кроме новых точек)... |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
1. Для подобных операций нужно использовать матрицы преобразований. В частности, для поворота эллипса подойдет вот этот код:
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
2. Трансформации не влияют на исходные координаты, так что если сделать как правильно советует Idsa, можно продолжать работать в "обычной" прямоугольной системе координат, всё будет поворачиваться автоматически.
-------------------- ![]() |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Это если Graphics трансформировать... Но если эллипс в GraphicsPath загонять и трансформировать - там уже координаты эллипса должны меняться... |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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; угол-то не известен... |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Ну и такой вопрос: после graphicsPath.AddEllipse(X1, Y1, X2, Y2) какие ещё параметры об эллипсе хранит этот объект (graphicsPath) кроме переданных точек и как их получить ?..
|
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
![]() Не совсем вкурил задачу точнее совсем не вкурил Но я не понял сложности последнего
зная две точки, узнать угол относительно горизонтальной или вертикальной оси как два байта переслать. тем более во вторм фреймворке у класса Math появился метод Atan2(double x, double y) -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Naum, по двум диагональным точкам прямоугольника можно построить бесконечное множество прямоугольников с разными углами наклона...
Поэтому, объект graphicsPath кроме этих двух диагональных точек должен хранить ещё какую-то информацию об эллипсе, скажем, угол его наклона... |
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Да уж, че-то я не подумал. Тады я прошу прощения и умываю руки. ![]() -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Скажем, эллипс хранится в виде следующих параметров:
1. Верхняя левая точка прямоугольника, в который вписан эллипс 2. Нижняя правая точка прямоугольника, в который вписан эллипс 3. Угол наклона эллипса Эти параметры однозначно задают положение и размеры эллипса на плоскости. Как теперь проводить трансформацию эллипса, чтобы каждый раз получать новые значения указанных параметров ? Скажем, растянуть по горизонтали (scale) наклонный эллипс... Главный вопрос: можно ли трансформировать эллипс и получать его новые параметры с помощью объекта GraphicsPath ? |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Всё, разобрался, GraphicsPath при запихивании в него эллипса формирует 13 точек (почему именно 13 - не понятно), расположенных на этом эллипсе. Трансформации подвергаются как раз эти точки, а не параметры эллипса... Поэтому обратно получить новые параметры эллипса не удасться (из новых 13 точек получить эллипс - вручную - довольно трудоёмко)...
Проще всего работать с прямоугольником, в который вписывается эллипс. Соответственно, трансформации в GraphicsPath будут подвергаться угловые точки этого прямоугольника... Единственная ручная работа - по 4-м точкам произвольно наклонённого прямоугольника (который описывает эллипс) получить соразмерный горизонтальный прямоугольник и угол наклона прямоугольника/эллипса (если за набор параметров, однозначно описывающих эллипс на плоскости, взять описывающий эллипс горизонтальный прямоугольник и угол его наклона относительно горизонтали (а этот набор параметров пока самый оптимальный для вывода на объект graphics - поворот системы координат на угол наклона описывающего эллипс прямоугольника, DrawEllipse и обратный поворот))... |
|||
|
||||
teesync |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.7.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
squilia |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 15.8.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |