0

I have been searching for a quite while but couldn't find any answer to this, anyways, I am working on Google Maps for iOS using Obj C and have drawn routes (polyline) using multiple coordinates provided to me by the server in the form of an array. But the problem is that I want to show arrow heads on that line so that the direction can be seen on the map. Please help.

Ahsan Ebrahim Khatri
  • 1,807
  • 1
  • 20
  • 27
  • See this question [How to calculate the coordinates of a arrowhead based on the arrow](http://stackoverflow.com/questions/10316180/how-to-calculate-the-coordinates-of-a-arrowhead-based-on-the-arrow). It doesn't give an Obj-C answer, but the algorithm is there and writing it in Obj-C is straightforward. HTH – CRD Aug 11 '16 at 02:12

1 Answers1

0

Here's a function which draws a nice little arrow line. It has some parameters you can tweak:

void TRDrawLineWithArrow(CGContextRef CXT, CGPoint FROMPOINT, CGPoint TOPOINT, CGFloat WIDTH, CGFloat ARROWSIZEMULTIPLE)
{
    CGFloat         rise = TOPOINT.y - FROMPOINT.y;
    CGFloat         run = TOPOINT.x - FROMPOINT.x;

    // trig
    CGFloat         length = sqrt(rise*rise + run+run);
    CGFloat         angle = atan2(rise, run);

    // the length of our arrowhead
    CGFloat         arrowLen = WIDTH*ARROWSIZEMULTIPLE;

    // push graphics context
    CGContextSaveGState(CXT);

    // transform context according to line's origin and angle
    CGContextTranslateCTM(CXT, FROMPOINT.x, FROMPOINT.y);
    CGContextRotateCTM(CXT, angle);

    // draw straight line
    CGContextMoveToPoint(CXT, 0, -WIDTH/2.);
    CGContextAddLineToPoint(CXT, 0, WIDTH/2.);
    CGContextAddLineToPoint(CXT, length-arrowLen, WIDTH/2.);

    // draw arrowhead
    CGContextAddLineToPoint(CXT, length-arrowLen, (WIDTH*ARROWSIZEMULTIPLE)/2.);
    CGContextAddLineToPoint(CXT, length, 0);
    CGContextAddLineToPoint(CXT, length-arrowLen, -(WIDTH*ARROWSIZEMULTIPLE)/2.);

    CGContextAddLineToPoint(CXT, length-arrowLen, -WIDTH/2.);
    CGContextAddLineToPoint(CXT, 0, -WIDTH/2.);

    // fill the path
    CGContextFillPath(CXT);

    // pop graphics context
    CGContextRestoreGState(CXT);
}

You would call it from a UIView like this:

CGContextRef cxt = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(cxt, [UIColor blackColor].CGColor);

TRDrawLineWithArrow(cxt, CGPointMake(10,10), CGPointMake(300,100), 5, 3);
TyR
  • 718
  • 4
  • 9