Рисование линий друг на друге

У меня есть проблема с рисованием линий друг на друга в 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

Другие вопросы по тегам