Рисование линий друг на друге
У меня есть проблема с рисованием линий друг на друга в OS X. Следующий код рисует красный прямоугольник, а затем тот же прямоугольник в зеленом цвете. В результате я ожидаю зеленый прямоугольник, потому что он рисуется последним. Я получаю смесь красного и зеленого - оливково-зеленого. Как изменить код, чтобы получить зеленый прямоугольник в этой ситуации?
import Cocoa
class TestView : NSView {
override func drawRect (dirtyRect : NSRect) {
super.drawRect (dirtyRect)
let rect = NSRect (x : 100 , y : 200 , width : 100 , height : 100)
var p = NSBezierPath ()
var c = NSColor (red : 1 , green : 0 , blue : 0 , alpha : 1)
c.set ()
p.appendBezierPathWithRect (rect)
p.stroke ()
p = NSBezierPath ()
c = NSColor (red : 0 , green : 1 , blue : 0 , alpha : 1)
c.set ()
p.appendBezierPathWithRect (rect)
p.stroke ()
}
}
Благодаря /Mikael
2 ответа
Зачем гладить дважды, если вы хотите только один цвет? В любом случае вам может понадобиться явно установить режим наложения графического контекста. NSGraphicsContext имеет свойство compositingOperation
Многие команды рисования в CoreGraphics и оболочках NS AppKit также могут принимать аргумент операции компоновки.
Также убедитесь, что ваше представление также имеет альфа 1,0, непрозрачное представление с альфа менее 1,0 может составлять
Наконец, существуют функции Foundation для получения интегральных ректов. Вы можете посмотреть на них и поэкспериментировать с шириной обводки. Если края вашего рисунка попадают на границы субпикселей или сглаживания границ, может произойти смешивание цветов из-за физических ограничений.
Msgstr "NSGraphicsContext имеет свойство compositingOperation".
Я попытался CompositeOperation(), прежде чем я задал вопрос здесь. Я получаю те же результаты при использовании спецификации CompositeCopy. Я не думаю, что CompositeOperation() влияет на результаты Stroke ().
"Многие команды рисования в CoreGraphics и оболочках NS AppKit также могут принимать аргумент операции компоновки"
Я не уверен, что понимаю, какие команды рисования вы имеете в виду. Я использую NSBezierPath.stroke() в соответствии с рекомендациями Apple.
"Также убедитесь, что ваше представление также имеет альфа 1,0, непрозрачное представление с альфа меньше, чем 1,0 может составлять"
Вновь созданный вид по умолчанию имеет альфа 1.0. Я не изменяю это.
"Наконец, существуют функции Фонда для получения интегральных ректов"
Я использую интегральные ректы в тестовом коде выше.
Подводя итог, остается открытым вопрос: как нарисовать 2 линии друг над другом и получить цвет линии, нарисованной последней?
Позже сегодня я обнаружил решение. Учуугака был на правильном пути. Именно сглаживание делает цвета смешанными. Даже чистые горизонтальные и вертикальные линии. Решение состоит в том, чтобы отключить сглаживание для обеих линий:
let g = NSGraphicsContext.currentContext ()!
g.saveGraphicsState ()
g.shouldAntialias = false
// Do the drawing
g.restoreGraphicsState ()
Благодаря /Mikael