Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« : 16-12-2007 13:44 » |
|
Привет, у меня проблема. Мне нужно сделать лабораторную работу по афинным преобразованиям на плоскости. Сама лабораторная готова, бока с самой отрисовкой на канве. Вот пример - елипс вытянутый вдоль оу, имеет координаты левого верхнего и правого нижнего угла. С помощь матрицы поворота я нашёл координаты повёрнутого прямоугольника (этих же углов) для данного еллипса. Но так на канве не рисуется. в общем, нужно отобразить еллипс под заданным углом (не битовый рисунок!). Кто знает, как это сделать, пожалуйста, напишите
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
RXL
|
|
« Ответ #1 : 16-12-2007 13:50 » |
|
Sandric, логично, что нужно пересчитать радиусы по их проекциям на плоскость. Конечно, это будет без учета перспективы.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #2 : 16-12-2007 13:59 » |
|
Я могу пересчитывать что хотите, поворот произ. по точкам, какую укажу, такую и повернёт, я не знаю вообще функции как на канве рисовать повернутые обьекты. Я тут думал, там есть copyrect, сохранять в битмат, перерисовывать канву с повёрнутим битмапом, его я знаю как поворачивать. Но там опять же copyrect функция для "перпендикулярных" к нач. координат точке. F1!
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
RXL
|
|
« Ответ #3 : 16-12-2007 14:57 » |
|
Sandric, рисуй не "повернутые объекты", а их проекцию на плоскость. Проекцией эллипса будет эллипс. Начни с проекции отрезка - с эллипсом тоже самое, но это как два отрезка с одной общей точкой (или как прямоугольный треугольник).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
zubr
Гость
|
|
« Ответ #4 : 16-12-2007 16:10 » |
|
Sandric, насколько я помню из школьного куса - любой элипс можно построить из 4 центров 2-мя радиусами. Поэтому можно воспользоваться функцией API AngleArc.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 16-12-2007 16:15 » |
|
zubr, вообще то, это лишь приближение , но для экрана сойдёт.
|
|
|
Записан
|
|
|
|
Sandric
Wimdows SUX
Участник
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 » |
|
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #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
|
|
« Ответ #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 (см. вложение). Мне самому стало интересно.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 17-12-2007 09:08 » |
|
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #13 : 17-12-2007 09:42 » |
|
Sandric, а если пропустить через матрицу поворота все точки канвы ?
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #14 : 17-12-2007 09:56 » |
|
Во нашел! Помню что использовал... SetWorldTransform(). Устанавливает матрицу мировых преобразований относительно hdc. Так что вперед! Устанавливаешь матрицу и рисуешь эллипс...
|
|
|
Записан
|
while (8==8)
|
|
|
zubr
Гость
|
|
« Ответ #15 : 17-12-2007 10:07 » |
|
sss, такое пройдет только для NT-систем. Правда Win98 уже мало кто юзает...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
Участник
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
Специалист
Offline
|
|
« Ответ #18 : 18-12-2007 01:55 » |
|
Вообще это стандартно - повернуть пространство, перенести в точку центра массы фигуры, нарисовать фигуру, перенести и повернуть обратно. Причем используя композицию преобразований и нахождение обратной матрицы движения. А кривые Безье дают погрешности.
|
|
|
Записан
|
while (8==8)
|
|
|
|