Проблема с реализацией Мультиградиентной кисти с нуля в C++ и GDI

Я пытаюсь реализовать градиентную кисть с нуля на С++ с помощью GDI. Я не хочу использовать GDI+ или любую другую графическую среду. Я хочу, чтобы градиент был любого направления (произвольный угол).

Мой алгоритм в псевдокоде:

      For each pixel in x dirrection
      For each pixel in the y direction
          current position = current pixel - centre                      //translate origin 
          rotate this pixel according to the given angle
          scalingFactor =( rotated pixel + centre ) / extentDistance    //translate origin back 
          rgbColor = startColor + scalingFactor(endColor - startColor)

extendDistance — это длина линии, проходящей из центра прямоугольника и имеющей градиент, равный углу градиента.

Хорошо, пока все хорошо. Я могу нарисовать это, и это выглядит красиво. НО, к сожалению, из-за бита вращения углы прямоугольника имеют неправильный цвет. Результат идеален только для углов, кратных 90 градусам. Проблема заключается в том, что коэффициент масштабирования не масштабируется по всему размеру прямоугольника.

Я не уверен, что вы поняли мою точку зрения, потому что очень сложно объяснить мою проблему без ее визуализации.

Если кто-то может помочь или перенаправить меня на какой-то полезный материал, я был бы признателен.


person George Eracleous    schedule 17.08.2011    source источник
comment
Публикация вашего фактического кода может быть более полезной. Псевдокод выглядит нормально, поэтому, возможно, проблема кроется в деталях реализации.   -  person Adrian McCarthy    schedule 17.08.2011
comment
Ну, основываясь на том, что я сделал до сих пор, я не думаю, что это проблема с фактической реализацией. Я думаю, что проблема в моем алгоритме. Код работает, но недостаточно хорош из-за упомянутой мной проблемы. Поэтому я прошу формальный или, по крайней мере, проверенный алгоритм для достижения эффекта градиента!   -  person George Eracleous    schedule 18.08.2011


Ответы (1)


Хорошо, ребята, исправили. По-видимому, проблема заключалась в том, что когда я вращал градиентную заливку (а не прямоугольник), я неправильно рассчитывал коэффициент масштабирования. Расстояние, на которое масштабируется градиент, изменяется в зависимости от направления градиента. Что нужно сделать, так это найти, где крайние точки прямоугольника заканчиваются после поворота, и на основе этого вы можете найти расстояние, на которое следует масштабировать градиент. Так что в основном то, что нужно исправить в моем алгоритме, — это extendDistance.

Как это сделать:

• Преобразование координат всех четырех углов

• Найдите наименьший из всех четырех x как minX

• Найдите наибольший из всех четырех крестиков и назовите его maxX.

• Сделайте то же самое для y.

•Расстояние между этими двумя точками (макс. и мин.) равно экстентному расстоянию.

person George Eracleous    schedule 18.08.2011