Нарисуйте стрелку на линии - PullRequest
2 голосов
/ 26 марта 2010

У меня есть этот код:

CGPoint arrowMiddle = CGPointMake((arrowOne.x + arrowTo.x)/2, (arrowOne.y + arrowTo.y)/2);

CGPoint arrowLeft = CGPointMake(arrowMiddle.x-40, arrowMiddle.y);
CGPoint arrowRight = CGPointMake(arrowMiddle.x, arrowMiddle.y + 40);

[arrowPath addLineToScreenPoint:arrowLeft];
[arrowPath addLineToScreenPoint:arrowMiddle];
[arrowPath addLineToScreenPoint:arrowRight];
[[mapContents overlay] addSublayer:arrowPath];
[arrowPath release];

с этим выводом:

http://img517.yfrog.com/img517/7690/schermafbeelding2010032.png

Что мне добавить, чтобы получить левую и правую одинаковую степень линии + 30 °.

Если у кого-то есть алгоритм рисования стрелки на линии, просьба дать его. Неважно, какой это язык программирования ...

Спасибо

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Вот что вы делаете. Сначала возьмите вектор линии и нормализуйте его, разделив его на длину - это даст вам вектор длины 1, указывающий в направлении линии. Затем, умножьте это на длину, которая вам нужна. Поверните его на 120 ° и -120 °, чтобы сделать стрелку. Наконец, сместите его на координаты, где вы хотите, чтобы это было. Вот как это будет выглядеть в коде:

// calculate the position of the arrow
CGPoint arrowMiddle;
arrowMiddle.x = (arrowOne.x + arrowTo.x) / 2;
arrowMiddle.y = (arrowOne.y + arrowTo.y) / 2;

// create a line vector
CGPoint v;
v.x = arrowTo.x - arrowOne.x;
v.y = arrowTo.y - arrowOne.y;

// normalize it and multiply by needed length
CGFloat length = sqrt(v.x * v.x + v.y * v.y);
v.x = 40 * (v.x / length);
v.y = 40 * (v.y / length);

// turn it by 120° and offset to position
CGPoint arrowLeft = CGPointApplyAffineTransform(v, CGAffineTransformMakeRotation(3.14 * 2 / 3));
arrowLeft.x = arrowLeft.x + arrowMiddle.x;
arrowLeft.y = arrowLeft.y + arrowMiddle.y;

// turn it by -120° and offset to position
CGPoint arrowRight = CGPointApplyAffineTransform(v, CGAffineTransformMakeRotation(-3.14 * 2 / 3));
arrowRight.x = arrowRight.x + arrowMiddle.x;
arrowRight.y = arrowRight.y + arrowMiddle.y;
1 голос
/ 27 марта 2010

Спасибо за ответ!Тем временем я нашел и решение.

Это так:


double slopy , cosy , siny;
                double Par = 10.0;  //length of Arrow (>)
                slopy = atan2( ( arrowOne.y - arrowTo.y ),
                              ( arrowOne.x - arrowTo.x ) );
                cosy = cos( slopy );
                siny = sin( slopy ); //need math.h for these functions</p>

<pre><code>            CGPoint arrowMiddle = CGPointMake((arrowOne.x + arrowTo.x)/2, (arrowOne.y + arrowTo.y)/2);
            [arrowPath addLineToScreenPoint:arrowMiddle];

            CGPoint arrowLeft = CGPointMake( arrowMiddle.x + round( - Par * cosy - ( Par / 2.0 * siny ) ), arrowMiddle.y + round( - Par * siny + ( Par / 2.0 * cosy ) ) );
            [arrowPath addLineToScreenPoint:arrowLeft];

            CGPoint arrowRight = CGPointMake( arrowMiddle.x + round( - Par * cosy + ( Par / 2.0 * siny ) ),arrowMiddle.y - round( Par / 2.0 * cosy + Par * siny ) );
            [arrowPath addLineToScreenPoint:arrowRight];

            [arrowPath addLineToScreenPoint:arrowMiddle];
            [[mapContents overlay] addSublayer:arrowPath];
            [arrowPath release];

Единственная проблема здесь в том, что я рисую его, как будто это RMPath(route-me framework) и что стрелка становится больше / меньше при увеличении / уменьшении.

Но спасибо за ответ, я посмотрю, какой код наиболее эффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...