Проблема с реализацией мультиградиентной кисти из scatch в C ++ и GDI - PullRequest
2 голосов
/ 17 августа 2011

Я пытаюсь реализовать градиентную кисть с нуля в C ++ с помощью 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)

экстентДистанция - это длина линии, проходящей от центра прямоугольника и имеющая градиент, равный углу наклона

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

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

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

1 Ответ

1 голос
/ 18 августа 2011

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

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

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

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

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

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

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

...