Могу ли я использовать graphics.RotateTransform () без этих артефактов? - PullRequest
3 голосов
/ 02 февраля 2012

Я реализую компонент выбора цвета, как описано в этой оригинальной статье .

Как видите, у меня есть отсортированные основы:

Working colour wheel

Однако одним из требований является возможность вращения цветового круга на произвольную величину. Думая, что это было бы легко, я немного арифметически определил местоположение мыши -> код значения цвета и следующий код для бита, который фактически рисует колесо:

newGraphics.TranslateTransform((float)this.Radius, (float)this.Radius);
newGraphics.RotateTransform((float)this.offset);
newGraphics.TranslateTransform((float)this.Radius * -1, (float)this.Radius * -1);

К сожалению, вращение растрового изображения таким образом на самом деле приводит к следующему:

Broken colour wheel after rotation

Обратите внимание на артефакты, которые появляются по обе стороны от центра.

Я использую неправильный подход? Или есть способ избавиться от этих неприятных разрывов?

1 Ответ

3 голосов
/ 02 февраля 2012

Глядя на исходный код из этого примера Microsoft, я внес следующие изменения в метод UpdateDisplay, добавив матрицу и установив метод RotateAt.

private void UpdateDisplay() {
  // Update the gradients, and place the 
  // pointers correctly based on colors and 
  // brightness.

  using (Brush selectedBrush = new SolidBrush(selectedColor)) {      
    using (Matrix m = new Matrix()) {
      m.RotateAt(35f, centerPoint);
      g.Transform = m;
      // Draw the saved color wheel image.
      g.DrawImage(colorImage, colorRectangle);
      g.ResetTransform();
    }

    // Draw the "selected color" rectangle.
    g.FillRectangle(selectedBrush, selectedColorRectangle);

    // Draw the "brightness" rectangle.
    DrawLinearGradient(fullColor);
    // Draw the two pointers.
    DrawColorPointer(colorPoint);
    DrawBrightnessPointer(brightnessPoint);
  }
}

Он повернул колесо 35градусов (хотя выбор цвета был выключен на 35 градусов, так как я не связывался со всем кодом), и это не вызвало разрывов.

Не на 100% уверен, что это ответ (но слишком долго для комментария), так что, возможно, это полезно.

...