[WinAPI, GDI] как быстро нарисовать повёрнутый эллипс?

margadon

а то только стандартный нашёл. Хочется, чтобы это работало быстро, да к тому же без операций BitBlt... Я много хочу? Или есть выход? Могу нарисовать брезенхамом эллипс, но вот поворот туда ну никак не лезет=(
(параллельно роюсь в гугле, что-то ничего толкового нет... )

Dasar

Использовать Gdi+ в задаче можно?

margadon

Неа... Только стандартный WinAPI... для вынь98х например

Dasar

> Могу нарисовать брезенхамом эллипс, но вот поворот туда ну никак не лезет
Перед выводом поворачивай точки на заданный угол

margadon

Не покатит... Там будут дыры между пикселями...=(

margadon

Жуткий метод - нарисовать на внеэкранке, потом повернуть и БитБлит... Но это и правда жутко...
А главное - такие фишки были ещё в прогах для вин3.1, значит там есть что-то быстрое...

Marinavo_0507

Многоугольник большой сделай.

margadon

Да, это маза. Но может есть попроще выход? А то при увеличении его надо будет адаптивно увеличивать число рёбер...

Marinavo_0507

Разве это проблема - увеличить число?

margadon

Да вот думал есть попроще что-то, чего я просто не знаю... Кстати при возрастающем радиусе придётся перевыделять память...=( И МНОГО.
Мда, если это ЕДИНСТВЕННЫЙ выход... Придётся имплементить его ;0

Dasar

> Не покатит... Там будут дыры между пикселями...=(
Считай брезенхейма с шагом в два или три раза большим.

Marinavo_0507

можно определить прямоугольник, в котором эллипс точно помещается, и для каждой строчки решить квадратное уравнение,
дальше аналогично брезенхейму
обобщается для любой выпуклой фигуры

Chupa

повёрнутый эллипс можно представить в виде эллипса, подвегрнутого аффинному преобразованию,
у которого одна ось параллельна координатной, а вторая наклонена
можно попробовать запустить два брезенхама одновременно:
один рисует стандартный эллипс, другой идёт вдоль наклонной оси и затыкает дыры на границе
(скорее всего это будет выглядеть как некая поправка на каждом шаге уже существующего алгоритма)

margadon

Я всё думаю о скорости данного алгоритма... А не проще вызвать несколько раз рисование линии, чем каждый раз делать сет_пихель?.. Можно рекуррентно считать значения синусов-косинусов и отрисовывать линиями...

margadon

И вообще, спасибо за идеи... Если честно, были у меня страшные мысли связанные с двойным брезенхэмом, но я их живо отмёл - может быть медленно.

DiDiPi

Странно, а почему тебе не подходит
BOOL ModifyWorldTransform(
HDC hdc, CONST XFORM *lpXform, DWORD iMode );
SetWorldTransform( XFORM...)
и аналоги этой функции (см. мсдн за подробностями)
// в матрице XFORM задаешь поворт (см. мсдн за подробностями).
Тормозить это не будет (только главное перерисовывай не весь экран, а invalidaterect на изменившуюся область, тогда и не будет тормозить).
Кстати (не в тему gdi+ работает под 98 (только с прогой тогда gdiplus.dll достаточно распространять)
2
А трансформации матричные для hdc и в GDI были, это не есть нововведение GDI+.

Bird_V

Если под 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--->
Взято отсюда.

DiDiPi

А, ну ясно про WorldTransform. Только какие требования - чтобы под 98 работало, или чтоб только GDI пользоваться?
Ведь GDI+ гарантированно работает под 98 (лично знаю, да и в msdn - щас уточнил - написано, что supported


Matrix::Rotate Method...
Minimum operating systems Windows 98/Me, Windows XP, Windows 2000, Windows NT 4.0 SP6


правда, челу только GDI почему-то требуется использовать...

margadon

Не, проще оказалось использовать адаптивный метод с многоугольником. Хотя, если по мне, так ModifyWorldTransform глобальней.
Оставить комментарий
Имя или ник:
Комментарий: