[WinAPI, GDI] как быстро нарисовать повёрнутый эллипс?
Использовать Gdi+ в задаче можно?
Неа... Только стандартный WinAPI... для вынь98х например
> Могу нарисовать брезенхамом эллипс, но вот поворот туда ну никак не лезет
Перед выводом поворачивай точки на заданный угол
Перед выводом поворачивай точки на заданный угол
Не покатит... Там будут дыры между пикселями...=(
Жуткий метод - нарисовать на внеэкранке, потом повернуть и БитБлит... Но это и правда жутко...
А главное - такие фишки были ещё в прогах для вин3.1, значит там есть что-то быстрое...
А главное - такие фишки были ещё в прогах для вин3.1, значит там есть что-то быстрое...
Многоугольник большой сделай.
Да, это маза. Но может есть попроще выход? А то при увеличении его надо будет адаптивно увеличивать число рёбер... 

Разве это проблема - увеличить число?
Да вот думал есть попроще что-то, чего я просто не знаю... Кстати при возрастающем радиусе придётся перевыделять память...=( И МНОГО.
Мда, если это ЕДИНСТВЕННЫЙ выход... Придётся имплементить его ;0
Мда, если это ЕДИНСТВЕННЫЙ выход... Придётся имплементить его ;0
> Не покатит... Там будут дыры между пикселями...=(
Считай брезенхейма с шагом в два или три раза большим.
Считай брезенхейма с шагом в два или три раза большим.
можно определить прямоугольник, в котором эллипс точно помещается, и для каждой строчки решить квадратное уравнение,
дальше аналогично брезенхейму
обобщается для любой выпуклой фигуры
дальше аналогично брезенхейму
обобщается для любой выпуклой фигуры
повёрнутый эллипс можно представить в виде эллипса, подвегрнутого аффинному преобразованию,
у которого одна ось параллельна координатной, а вторая наклонена
можно попробовать запустить два брезенхама одновременно:
один рисует стандартный эллипс, другой идёт вдоль наклонной оси и затыкает дыры на границе
(скорее всего это будет выглядеть как некая поправка на каждом шаге уже существующего алгоритма)
у которого одна ось параллельна координатной, а вторая наклонена
можно попробовать запустить два брезенхама одновременно:
один рисует стандартный эллипс, другой идёт вдоль наклонной оси и затыкает дыры на границе
(скорее всего это будет выглядеть как некая поправка на каждом шаге уже существующего алгоритма)
Я всё думаю о скорости данного алгоритма... А не проще вызвать несколько раз рисование линии, чем каждый раз делать сет_пихель?.. Можно рекуррентно считать значения синусов-косинусов и отрисовывать линиями...
И вообще, спасибо за идеи... Если честно, были у меня страшные мысли связанные с двойным брезенхэмом, но я их живо отмёл - может быть медленно.
Странно, а почему тебе не подходит
BOOL ModifyWorldTransform(
HDC hdc, CONST XFORM *lpXform, DWORD iMode );
SetWorldTransform( XFORM...)
и аналоги этой функции (см. мсдн за подробностями)
// в матрице XFORM задаешь поворт (см. мсдн за подробностями).
Тормозить это не будет (только главное перерисовывай не весь экран, а invalidaterect на изменившуюся область, тогда и не будет тормозить).
Кстати (не в тему gdi+ работает под 98 (только с прогой тогда gdiplus.dll достаточно распространять)
2
А трансформации матричные для hdc и в GDI были, это не есть нововведение GDI+.
BOOL ModifyWorldTransform(
HDC hdc, CONST XFORM *lpXform, DWORD iMode );
SetWorldTransform( XFORM...)
и аналоги этой функции (см. мсдн за подробностями)
// в матрице XFORM задаешь поворт (см. мсдн за подробностями).
Тормозить это не будет (только главное перерисовывай не весь экран, а invalidaterect на изменившуюся область, тогда и не будет тормозить).
Кстати (не в тему gdi+ работает под 98 (только с прогой тогда gdiplus.dll достаточно распространять)
2
А трансформации матричные для hdc и в GDI были, это не есть нововведение GDI+.
Если под Win9x то фиг получится:
Windows GDIВзято отсюда.
ModifyWorldTransform
The ModifyWorldTransform function changes the world transformation for a device context using the specified mode.
BOOL ModifyWorldTransform(
HDC hdc, // handle to device context
CONST XFORM *lpXform, // transformation data
DWORD iMode // modification mode
);
<---cut--->
equirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Unsupported.
<---cut--->
А, ну ясно про WorldTransform. Только какие требования - чтобы под 98 работало, или чтоб только GDI пользоваться?
Ведь GDI+ гарантированно работает под 98 (лично знаю, да и в msdn - щас уточнил - написано, что supported
правда, челу только GDI почему-то требуется использовать...
Ведь GDI+ гарантированно работает под 98 (лично знаю, да и в msdn - щас уточнил - написано, что supported
Matrix::Rotate Method...
Minimum operating systems Windows 98/Me, Windows XP, Windows 2000, Windows NT 4.0 SP6
правда, челу только GDI почему-то требуется использовать...
Не, проще оказалось использовать адаптивный метод с многоугольником. Хотя, если по мне, так ModifyWorldTransform глобальней.
Оставить комментарий
margadon
а то только стандартный нашёл. Хочется, чтобы это работало быстро, да к тому же без операций BitBlt... Я много хочу? Или есть выход? Могу нарисовать брезенхамом эллипс, но вот поворот туда ну никак не лезет=((параллельно роюсь в гугле, что-то ничего толкового нет...