iPhone, как мне сделать две соединенные линии, чтобы следовать за положением?

Я сделал хвост речевого пузыря, используя базовую графику и

Хвостовая часть речевого пузыря должна перемещаться в любую точку, как я хочу.

Проблема в том, что когда конечная часть хвоста (заостренная часть) направлена ​​вниз, все работает нормально.

Но когда пузырь перевернут, например, часть пузыря находится внизу, хвостовая часть находится внизу.

вверху две соединенные линии хвостовой части пересекаются друг с другом и образуют букву X, хотя это должно быть похоже на /\

может кто-нибудь, пожалуйста, помогите мне?

double angle(CGPoint p1, CGPoint p2)
{
    //BOOL bRev = TRUE;
    double dx = p2.x - p1.x;
    double dy = p2.y - p1.y;
    if (dx == 0 && dy == 0) return 0.0

    if (dy == 0) {
        if (dx > 0) return 0.0;
        else return M_PI;
    }

    if (dx == 0) {
        if (dy > 0) {
            double ang = M_PI/2.0;
            //if (bRev) ang = M_PI*2 - ang;
            return ang;
        }
        else {
            double ang = M_PI/2.0 * 3;
            //if (bRev) ang = M_PI*2 - ang;
            return ang;
        }
    }

    if (dx > 0) {
        if (dy > 0) {
            double ang = atan((double)dy/(double)dx); // 1사분면
            //if (bRev) ang = M_PI*2 - ang;
            return ang;
        }
        else {
            double ang = atan((double)dy/(double)dx) + 2.0*M_PI; // 4사분면
            //if (bRev) ang = M_PI*2 - ang;
            return ang;
        }
    }
    else {
        double ang = atan((double)dy/(double)dx) + M_PI;
        //if (bRev) ang = M_PI*2 - ang;
        return ang;
    }
    return 0.0;
}

- (double)degree:(CGPoint)p1 and:(CGPoint)p2
{
    double rad = angle(p1, p2);
    double deg = rad * 180.0 / M_PI;
    if (deg >= 360.0) deg = deg - 360.0;
    return (deg);
}

- (CGPoint)getPoint:(CGPoint)cPt Len:(int)len BaseDegree:(double)d1 MoveDegree:(double)d2
{
    double radian = 3.14/180.0;
    CGPoint pt1;
    pt1.x = cPt.x + len*cos((d2-d1)*radian);
    pt1.y = cPt.y - len*sin((d2-d1)*radian);
    return pt1;
}

- (void)drawRect:(CGRect)rect{
    double degree1 = [self degree:CGPointMake(view.frame.origin.x(view.frame.size.width)/2,
                                              view.frame.origin.y+(view.frame.size.height)/2)
                              and:lastPt];

    CGPoint cpt = CGPointMake(view.frame.origin.x+(view.frame.size.width)/2,
                          view.frame.origin.y+(view.frame.size.height)/2);  

    CGPoint p1 = [self getPoint:cpt Len:10 BaseDegree:degree1 MoveDegree:90];
    CGPoint p2 = [self getPoint:cpt Len:10 BaseDegree:degree1 MoveDegree:-90];

    CGPathMoveToPoint(ctx, nil, p1.x, p1.y);
    CGPathAddLineToPoint(ctx, nil, lastPt.x, lastPt.y);
    CGPathAddLineToPoint(ctx, nil, lastPt.x-2, lastPt.y+2);
    CGPathAddLineToPoint(ctx, nil, lastPt.x-4, lastPt.y);
    CGPathAddLineToPoint(ctx, nil, p2.x, p2.y);
}

введите здесь описание изображения


person tulurira    schedule 21.04.2012    source источник
comment
Что ты имеешь ввиду под поднятием хвоста?   -  person leftspin    schedule 21.04.2012


Ответы (1)


В вашем коде, когда вы рисуете линию, вы правильно вычисляете начальную и конечную точки, но затем в конце вы идете:

CGPathAddLineToPoint(ctx, nil, lastPt.x, lastPt.y);
CGPathAddLineToPoint(ctx, nil, lastPt.x-2, lastPt.y+2);
CGPathAddLineToPoint(ctx, nil, lastPt.x-4, lastPt.y);

Таким образом, вы всегда рисуете крошечную букву v в нижней/верхней/боковой части вашего пузыря как фиксированную правую букву v слева вверху, в середине внизу, справа вверху, независимо от того, в какую сторону вы рисуете.

Вам нужно изменить это, чтобы убедиться, что эти -2/+2 реагируют на то, в каком направлении вверх/вниз вы находитесь - например, когда вы находитесь вверх ногами, это должно закончиться как

CGPathAddLineToPoint(ctx, nil, lastPt.x+4, lastPt.y);
CGPathAddLineToPoint(ctx, nil, lastPt.x+2, lastPt.y-2);
CGPathAddLineToPoint(ctx, nil, lastPt.x, lastPt.y);

за исключением того, что это должно быть рассчитано, а не просто жестко закодировано.

person Woody    schedule 23.04.2012