#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
оставляя текущую точку в конце добавленного сегмента.