2013-11-15 3 views
1

Я хотел бы нарисовать стрелку в верхней части строки. Я знаю координаты startPoint и endPoint, а также знаю угол и длину стрелки.Математика за рисунком стрелки в iOS

Моя логика:

  1. рассчитать угол наклона между начальной точкой и конечной точкой
  2. вычислить положение точек со стрелками

Я использую следующую формулу:

CGFloat endX = cos(angleOfArrowPoint-slopeAngle) * distance + point.x; 
CGFloat endY = sin(angleOfArrowPoint-slopeAngle) * distance + point.y; 

Что я делаю неправильно?

+0

Поскольку в названии вашего вопроса вы написали «математику», могу ли я предложить вам взглянуть на Аффинные преобразования, в частности, на ротации и переводы? Если они доступны в вашей среде программирования, и если вы сможете их использовать, вы сможете писать код без необходимости «сырых» формул, но с более высоким уровнем абстракции. –

+0

Как это не работает? Можете ли вы описать, какой код вы включили? И как это отличается от того, что вы ожидали? Фото было бы лучше. EDIT: просто заметил, сколько лет этот вопрос - у вас все еще есть проблемы с этим? Если вы исправили его самостоятельно, вы должны опубликовать то, что вы сделали в качестве ответа, и принять его. – GeneralMike

+0

Вы посмотрели [этот ответ] (http://stackoverflow.com/a/13559449/77567)? Это может быть проще, чем ваш подход. –

ответ

0

Вот метод, который я использую для рисования линии со стрелкой на обоих концах, которая показывает вам математику рисования стрелки на линии. Этот метод должен быть легко модифицирован для ваших конкретных потребностей.

-(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); 
} 
Смежные вопросы