Сглаживание краев нетронутых контуров на SKShapeNode

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

   //creates shape node to contain path
            let myTriangle = SKShapeNode()
    //declares path object
            let myPath = CGPathCreateMutable()
    //moves to starting point of shape
            CGPathMoveToPoint(myPath, nil, -50, 0)
    //draws lines of shape
            CGPathAddLineToPoint(myPath, nil, 0, 100 )
            CGPathAddLineToPoint(myPath, nil, 50, 0 )
            CGPathAddLineToPoint(myPath, nil, -50, 0 )
    //closes path
            CGPathCloseSubpath(myPath)

            myTriangle.antialiased = true
//adds path to shape node
            myTriangle.path = myPath
//sets fill colour and zero line width
            myTriangle.fillColor = SKColor.blueColor()
            myTriangle.lineWidth = 0
//sets antialiasing
            myTriangle.antialiased = true
//sets position in parent object and adds node
            myTriangle.position = CGPointMake(600, 600)
            self.addChild(myTriangle)

Любые идеи?

Большое спасибо, кв.


person Kwangle    schedule 27.01.2017    source источник
comment
Можете ли вы предоставить несколько скриншотов, иллюстрирующих проблемы, и в идеале?   -  person Confused    schedule 27.01.2017
comment
Вот пример, который я создал. Треугольник имеет код, который я разместил, за исключением крайней левой точки, которую я переместил, чтобы более четко показать край. Обратите внимание, что красный прямоугольник и черные круги имеют белую линию и совершенно гладкие. Красная коробка вращается и все еще отлично отображается. Я увеличил изображение на 200 %, так что надеюсь, вы увидите разницу: imgur.com/a/ypPFk   -  person Kwangle    schedule 27.01.2017
comment
Это немного удивительно. Если погладить треугольник, он нормально выглядит?   -  person Maury Markowitz    schedule 27.01.2017


Ответы (1)


О сглаживании вы можете ознакомиться здесь с этим документ. Я также видел, что у вас есть lineWidth, равный 0, что не помогает в соответствии с этим документом.

Чтобы улучшить внешний вид вашего пути, вы также можете попробовать:

yourPath.lineCap = CGLineCap(rawValue: 1)!

где, следуя источнику:

/* Line cap styles. */
public enum CGLineCap : Int32 {   
    case butt
    case round
    case square
}

Некоторый код к примеру, написанный на Swift 3:

        let myTriangle = SKShapeNode()
        let myPath = CGMutablePath()
        myPath.move(to: CGPoint(x:-110,y: 0))
        myPath.addLine(to: CGPoint(x:0,y: 290))
        myPath.addLine(to: CGPoint(x:260,y: 0))
        myPath.addLine(to: CGPoint(x:-110,y: 0))
        myPath.closeSubpath()
        myTriangle.path = myPath
        myTriangle.fillColor = SKColor.white
        myTriangle.lineWidth = 2
        myTriangle.lineCap = CGLineCap(rawValue: 1)!
        myTriangle.strokeColor = SKColor.white
        myTriangle.isAntialiased = true
        myTriangle.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
        self.addChild(myTriangle)

Вывод этого кода (lineWidth 2 и lineCap valorized..):

введите здесь описание изображения

Ваш вывод (lineWidth равно 0):

введите здесь описание изображения

person Alessandro Ornano    schedule 27.01.2017
comment
Я думаю, что это просто изменяет способ отображения концов линий и углов, аналогично Adobe Illustrator. - person Kwangle; 27.01.2017
comment
@Kwangle Я добавил немного кода, чтобы помочь вам в исследованиях - person Alessandro Ornano; 28.01.2017
comment
Да, это нормально, но я хочу, чтобы края были сглажены без необходимости рисовать обводку вокруг контура. Кажется, что Swift позволяет сглаживать только пройденные пути. Мне нужны были точные границы объектов, так как я использовал формы для проверки кода обнаружения столкновений, поэтому добавление нескольких пикселей ширины нежелательно. Однако большое спасибо за ваше исследование и вклад. - person Kwangle; 28.01.2017
comment
SKShapeNode имеют некоторые ограничения, это точно, но если вы вычтете разумную ширину, например 2 точки, из размеров вашей фигуры, вы должны решить свою проблему, особенно потому, что обводка имеет тот же цвет, что и фигура. О проверке столкновения, как вы проверяете столкновение? Вы используете физический движок? - person Alessandro Ornano; 28.01.2017
comment
Да, но может быть неудобно вычислять эту вставку для неправильных форм, и это кажется странным упущением для SpriteKit. Я пишу свои собственные процедуры обнаружения столкновений в качестве упражнения, и у меня есть круг для круга и круг для угловых ящиков. В очередной раз благодарим за помощь. - person Kwangle; 28.01.2017
comment
Вы всегда можете использовать <your shape>.intersects(<#T##node: SKNode##SKNode#>) или <your shape>.contains(<#T##p: CGPoint##CGPoint#>) для обработки коллизий. - person Alessandro Ornano; 28.01.2017