Я пытаюсь рисовать элементы индикатора скорости с использованием Core Graphics на OSX. Я почти получил его, но мне нужна небольшая помощь в центре, который находится внутри калибра. Вот образ того, что я пытаюсь сделать:Рисование спидометра с базовой графикой на OSX в NSView
Вот образ того, что у меня до сих пор:
Я знаю, как рисовать круг кольца и как рисовать сегменты на основе вокруг центра датчика, например так:
- (void)drawOuterGaugeRingsInRect:(CGContextRef)contextRef rect:(NSRect)rect {
CGContextSetLineWidth(contextRef,self.gaugeRingWidth);
CGContextSetStrokeColorWithColor(contextRef, [MyColors SpeedGaugeOuterRingGray].CGColor);
CGFloat startRadians = 0;
CGFloat endRadians = M_PI*2;
CGFloat radius = self.bounds.size.width/2 - 5;
CGContextAddArc(contextRef, CGRectGetMidX(rect),CGRectGetMidY(rect),radius,startRadians,endRadians,YES);
//Render the outer gauge
CGContextStrokePath(contextRef);
//Draw the inner gauge ring.
radius -= self.gaugeRingWidth;
CGContextSetStrokeColorWithColor(contextRef, [MyColors SpeedGaugeInnerRingGray].CGColor);
CGContextAddArc(contextRef, CGRectGetMidX(rect),CGRectGetMidY(rect),radius,startRadians,endRadians,YES);
//Render the inner gauge
CGContextStrokePath(contextRef);
radius -= self.gaugeRingWidth;
//Draw and fill the gauge background
CGContextSetFillColorWithColor(contextRef, [MyColors SpeedGaugeCenterFillBlack ].CGColor);
CGContextSetStrokeColorWithColor(contextRef, [MyColors SpeedGaugeCenterFillBlack].CGColor);
CGContextAddArc(contextRef, CGRectGetMidX(rect),CGRectGetMidY(rect),radius,startRadians,endRadians,YES);
//Render and fill the gauge background
CGContextDrawPath(contextRef, kCGPathFillStroke);
/*BLUE CIRCULAR DIAL */
//Prepare to draw the blue circular dial.
radius -= self.gaugeRingWidth/2;
//Adjust gauge ring width
CGContextSetLineWidth(contextRef,self.gaugeRingWidth/2);
CGContextSetStrokeColorWithColor(contextRef, [MyColors SpeedGaugeBlue].CGColor);
CGFloat startingRadians = [MyMathHelper degressToRadians:135];
CGFloat endingRadians = [MyMathHelper degressToRadians:45];
CGContextAddArc(contextRef, CGRectGetMidX(rect),CGRectGetMidY(rect),radius,startingRadians,endingRadians,NO);
//Render the blue gauge line
CGContextStrokePath(contextRef);
}
код выше, называется в drawRect:
метод в моем NSView
Ключевой раздел является код здесь:
- (void)drawInnerDividerLines:(CGContextRef)context rect:(NSRect)rect {
CGFloat centerX = CGRectGetMidX(rect);
CGFloat centerY = CGRectGetMidY(rect);
CGContextSetLineWidth (context, 3.0);
CGContextSetRGBStrokeColor (context, 37.0/255.0, 204.0/255.0, 227.0/255.0, 0.5);
CGFloat destinationX = centerX + (centerY * (cos((135)*(M_PI/180))));
CGFloat destinationY = centerY + (centerX * (sin((135)*(M_PI/180))));
NSPoint destinationPoint = NSMakePoint(destinationX, destinationY);
CGContextMoveToPoint(context, centerX, centerY);
CGContextAddLineToPoint(context, destinationPoint.x, destinationPoint.y);
CGContextStrokePath(context);
}
Я понимаю, что здесь происходит, но проблема, которую я пытаюсь решить рисует маленькие линии, прочь внутренний синюю линию, которая простирается к центральной точке Вид, но не тянет до центра. Я немного не уверен в том, как изменить математику и логику рисования, чтобы достичь этого. Вот единица окружности I, основанная на углах для Core Graphics Drawing.
Основные проблемы, я пытаюсь решить, являются:
Как определить правильную начальную точку прочь светло-голубой внутренней линии в качестве точки гляделки для каждого датчика клеща. Прямо сейчас, я рисую полную линию от центра до края калибра.
Как контролировать длину указателя галочки по мере того, как он рисует направленный к центру от его точки происхождения на синей линии.
Любые советы или советы, которые указывали бы на меня в правильном направлении для решения этого вопроса, будут оценены по достоинству.
Было именно то, что мне было нужно, спасибо за это! – zic10