Вот метод, который я использую для рисования линии со стрелкой на обоих концах, которая показывает вам математику рисования стрелки на линии. Этот метод должен быть легко модифицирован для ваших конкретных потребностей.
-(void)drawDoubleArrowLineInContext:(CGContextRef)inContext fromPoint:(CGPoint)inFromPoint toPoint:(CGPoint)inToPoint {
CGContextSetLineWidth(inContext, 1.0);
CGContextSetStrokeColorWithColor(inContext, [UIColor blackColor].CGColor );
CGContextSetFillColorWithColor(inContext, [UIColor blackColor].CGColor);
CGContextBeginPath(inContext);
CGContextMoveToPoint(inContext, inFromPoint.x, inFromPoint.y);
CGContextAddLineToPoint(inContext, inToPoint.x, inToPoint.y);
CGContextClosePath(inContext);
CGContextDrawPath(inContext, kCGPathStroke);
[self drawArrowInContext:inContext atPoint:inFromPoint pointFrom:inToPoint];
[self drawArrowInContext:inContext atPoint:inToPoint pointFrom:inFromPoint];
}
-(void)drawArrowInContext:(CGContextRef)inContext atPoint:(CGPoint)inTipPoint pointFrom:(CGPoint)inFromPoint {
const CGFloat kArrowHeight = 15;
const CGFloat kArrowBaseHalfWidth = 5;
double arrowAngle = atan2((inFromPoint.y - inTipPoint.y), (inFromPoint.x - inTipPoint.x));
CGContextBeginPath(inContext);
CGContextMoveToPoint(inContext, inTipPoint.x, inTipPoint.y);
CGContextAddLineToPoint(inContext, (inTipPoint.x + kArrowHeight*cos(arrowAngle)) - kArrowBaseHalfWidth*sin(arrowAngle),
(inTipPoint.y + kArrowHeight*sin(arrowAngle)) + kArrowBaseHalfWidth*cos(arrowAngle));
CGContextAddLineToPoint(inContext, (inTipPoint.x + kArrowHeight*cos(arrowAngle)) + kArrowBaseHalfWidth*sin(arrowAngle),
(inTipPoint.y + kArrowHeight*sin(arrowAngle)) - kArrowBaseHalfWidth*cos(arrowAngle));
CGContextAddLineToPoint(inContext, inTipPoint.x, inTipPoint.y);
CGContextClosePath(inContext);
CGContextDrawPath(inContext, kCGPathFillStroke);
}
Поскольку в названии вашего вопроса вы написали «математику», могу ли я предложить вам взглянуть на Аффинные преобразования, в частности, на ротации и переводы? Если они доступны в вашей среде программирования, и если вы сможете их использовать, вы сможете писать код без необходимости «сырых» формул, но с более высоким уровнем абстракции. –
Как это не работает? Можете ли вы описать, какой код вы включили? И как это отличается от того, что вы ожидали? Фото было бы лучше. EDIT: просто заметил, сколько лет этот вопрос - у вас все еще есть проблемы с этим? Если вы исправили его самостоятельно, вы должны опубликовать то, что вы сделали в качестве ответа, и принять его. – GeneralMike
Вы посмотрели [этот ответ] (http://stackoverflow.com/a/13559449/77567)? Это может быть проще, чем ваш подход. –