Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как на канве отрисовать фигуру (еллипс) под углом?  (Прочитано 21201 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« : 16-12-2007 13:44 » 

Привет, у меня проблема. Мне нужно сделать лабораторную работу по афинным преобразованиям на плоскости. Сама лабораторная готова, бока с самой отрисовкой на канве. Вот пример - елипс вытянутый вдоль оу, имеет координаты левого верхнего и правого нижнего угла. С помощь матрицы поворота я нашёл координаты повёрнутого прямоугольника (этих же углов) для данного еллипса. Но так на канве не рисуется. в общем, нужно отобразить еллипс под заданным углом (не битовый рисунок!). Кто знает, как это сделать, пожалуйста, напишите
Записан

We hate love, we love hate...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-12-2007 13:50 » 

Sandric, логично, что нужно пересчитать радиусы по их проекциям на плоскость. Конечно, это будет без учета перспективы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« Ответ #2 : 16-12-2007 13:59 » 

Я могу пересчитывать что хотите, поворот произ. по точкам, какую укажу, такую и повернёт, я не знаю вообще функции как на канве рисовать повернутые обьекты. Я тут думал, там есть copyrect, сохранять в битмат, перерисовывать канву с повёрнутим битмапом, его я знаю как поворачивать. Но там опять же copyrect функция для "перпендикулярных" к нач. координат точке. F1!
Записан

We hate love, we love hate...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 16-12-2007 14:57 » 

Sandric, рисуй не "повернутые объекты", а их проекцию на плоскость. Проекцией эллипса будет эллипс.
Начни с проекции отрезка - с эллипсом тоже самое, но это как два отрезка с одной общей точкой (или как прямоугольный треугольник).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #4 : 16-12-2007 16:10 » 

Sandric, насколько я помню из школьного куса - любой элипс можно построить из 4 центров 2-мя радиусами. Поэтому можно воспользоваться функцией API AngleArc.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-12-2007 16:15 » 

zubr, вообще то, это лишь приближение  , но для экрана сойдёт.
Записан

Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« Ответ #6 : 16-12-2007 17:36 » 

А можна както по подробней. Пример бы было просто чудесно
Записан

We hate love, we love hate...
zubr
Гость
« Ответ #7 : 16-12-2007 18:16 » 

http://msdn2.microsoft.com/en-us/library/ms534251.aspx
Там же и пример.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 16-12-2007 20:03 » 

погодьте, может я чего-то не понимаю
а кто отменял формулу эллипса

x2/a2+y2/b2=1

увы не знаю что такое афинные преобразования

а дальше в силу вступают, различного рода преобразования
« Последнее редактирование: 16-12-2007 20:06 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zubr
Гость
« Ответ #9 : 16-12-2007 21:39 » 

Sla, исходя из вопроса автора темы, с координатами и формулами у него нет проблем.
Цитата
в общем, нужно отобразить еллипс под заданным углом (не битовый рисунок!).
Как я понимаю, имеется в виду не допустимость растровой графики. А значит способ отрисовки точек по координатам не годится.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 17-12-2007 08:21 » 

В черчении эллипс рисуют сопряжением 4-х окружностей. Сперва нужно найти центры этих окружностей, потом точки пересечения. Этот материал можно найти в сети.

Кроме того, все эти извраты не нужны, т.к. TCanvas имеет метод Ellipse:

Цитата
Draws the ellipse defined by a bounding rectangle on the canvas.

void __fastcall Ellipse(int X1, int Y1, int X2, int Y2);
void __fastcall Ellipse(TRect Rect);

Description

Call Ellipse to draw a circle or ellipse on the canvas. Specify the bounding rectangle either by giving
The top left point at pixel coordinates (X1, Y1) and the bottom right point at (X2, Y2). A TRect value.
If the bounding rectangle is a square, a circle is drawn.
The ellipse is outlined using the value of Pen, and filled using the value of Brush.
Note:   On Windows 95, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768.

Здесь строиться эллипс, вписанный в заданный параметрами прямоугольник. Дальше, по моему, - элементарная арифметика, и рассказывать тут нечего.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #11 : 17-12-2007 08:58 » 

RXL, интересно как тебе удастся отрисовать повернутый элипс с помощью метода Ellips (см. вложение). Мне самому стало интересно.

* Elipse.jpg (11.43 Кб - загружено 1159 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 17-12-2007 09:08 » 

недавно только видел темку
https://forum.shelek.ru/index.php/topic,10717.0.html
Записан

sss
Специалист

ru
Offline Offline

« Ответ #13 : 17-12-2007 09:42 » 

Sandric, а если пропустить через матрицу поворота все точки канвы ?
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #14 : 17-12-2007 09:56 » new

Во нашел! Помню что использовал... SetWorldTransform(). Устанавливает матрицу мировых преобразований относительно hdc. Так что вперед! Устанавливаешь матрицу и рисуешь эллипс...
Записан

while (8==8)
zubr
Гость
« Ответ #15 : 17-12-2007 10:07 » 

sss, такое пройдет только для NT-систем. Правда Win98 уже мало кто юзает...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 17-12-2007 12:25 » 

Цитата
The SetWorldTransform function sets a two-dimensional linear transformation between world space and page space for the specified device context. This transformation can be used to scale, rotate, shear, or translate graphics output.

BOOL SetWorldTransform(
    HDC hdc,   // handle of device context
    CONST XFORM *lpXform    // address of transformation data
   );   
 

Parameters

hdc    Identifies the device context.
lpXform    Points to an XFORM structure that contains the transformation data.
 
Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

Remarks

For any coordinates (x, y) in world space, the transformed coordinates in page space (x', y') can be determined by the following algorithm:

x' = x * eM11 + y * eM21 + eDx, 
y' = x * eM12 + y * eM22 + eDy,
 
where the transformation matrix is represented by the following:

| eM11 eM12 0 | 
| eM21 eM22 0 |
| eDx  eDy  1 |

The mapping mode (defined by the current window and viewport extents origins) serves to define units and scales.
The world transformation is usually used to scale or rotate logical images in a device-independent way.
The default world transformation is the identity matrix with zero offset.
The SetWorldTransform function will fail unless the graphics mode for the given device context has been set to GM_ADVANCED by previously calling the SetGraphicsMode function. Likewise, it will not be possible to reset the graphics mode for the device context to the default GM_COMPATIBLE mode, unless the world transformation has first been reset to the default identity transformation by calling SetWorldTransform or ModifyWorldTransform.

See Also

GetWorldTransform, ModifyWorldTransform, SetGraphicsMode, SetMapMode, SetViewportExtEx, SetViewportOrgEx, SetWindowExtEx, SetWindowOrgEx, XFORM
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« Ответ #17 : 17-12-2007 19:49 » 

Пасибо всем, особенно sss (+1!) за SetWorldTransform(), но это немного не удобно для меня, так как у меня в задании необходимо самому задавать точку начала координат, и поворачивать относ. неё, а в этой функции как раз наоборот, к тому же глупо как-то сначала поворачивать точки, что бы потом это не использовать, а поворачивать с SetWorldTransform() без преобразования. Эта функция поворачивает, а не рисует, я и сам поворачиваю точки. Я понял как - с помощью кривых безье. Они легко рисуются как 2 кривых для каждово еллипса. Так что пасиба, трабла отпала сама собой  Ага
Записан

We hate love, we love hate...
sss
Специалист

ru
Offline Offline

« Ответ #18 : 18-12-2007 01:55 » 

Вообще это стандартно - повернуть пространство, перенести в точку центра массы фигуры, нарисовать фигуру, перенести и повернуть обратно. Причем используя композицию преобразований и нахождение обратной матрицы движения.  А кривые Безье дают погрешности. 
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines