Линия NSBezierPath утончается

#objective-c #cocoa #nsbezierpath

#objective-c #cocoa #nsbezierpath

Вопрос:

Я пытаюсь нарисовать кривую степенной функции в прямоугольнике размером 300×300 пикселей, используя NSBezierPath следующим образом:

 -(void)drawPowerCurve:(float)power points:(int)numbPoints{
    NSBezierPath * path = [NSBezierPath bezierPath];
    [path setLineWidth: 1.0];
    [[NSColor colorWithCalibratedRed:0.0 green:0.0 blue:1.0 alpha:1.0] set];

    NSPoint borderOrigin = {35.5,15.5};
    NSPoint endPoint;
    [path moveToPoint:borderOrigin];
    for(int i = 0; i < numbPoints; i  ){
        endPoint.x = borderOrigin.x   (300.0/numbPoints)*(i 1);
        endPoint.y = borderOrigin.y   300.0*pow(((i 1)/(float)numbPoints), power);
        [path lineToPoint:endPoint];
        [path stroke];
        [path moveToPoint:endPoint];
    }
}
  

Однако кривая утоньшается на верхнем конце по сравнению с нижним концом.
Например, мощность = 1,8, а количество точек = 50.
Также кривая выглядит не такой гладкой, как, например, кривые, показанные в утилите Apple ColorSync. Конечно, я не знаю, как они рисуют кривые в ColorSync. Любые идеи о том, как улучшить внешний вид этих кривых (в частности, избавиться от утончения).

Редактировать — Вот скриншот: введите описание изображения здесь

Комментарии:

1. Пожалуйста, опубликуйте снимок экрана. Кроме того, какова высота вида (или графического контекста), в котором вы рисуете?

2. С трудом вставляю скриншот сюда — это файл png. Однако я замечаю, что если я использую гораздо больше точек, например, от 500 до 1000, а не 50, то истончение будет намного меньше. Не понимаю, почему это было бы. Кроме того, что касается графического контекста, я не сохраняю / восстанавливаю графический контекст.

3. В качестве предположения (извините, не могу проверить на данный момент) попробуйте вывести stroke из цикла, чтобы вы рисовали кривую только один раз, а не numbPoints раз по мере ее роста. Вы также можете удалить избыточность moveToPoint в цикле, lineToPoint оставляя текущую точку в конце добавленного сегмента.

4. @CRD, который это исправил. Кривая теперь выглядит идентично кривой в ColorSync. Вы могли бы предоставить это в качестве ответа, и я приму его.

Ответ №1:

Переместите stroke из цикла, чтобы рисовать кривую только один раз, а не numbPoints раз по мере ее роста. Также удалите избыточность moveToPoint в цикле, lineToPoint оставляя текущую точку в конце добавленного сегмента.