Я сделал хвост речевого пузыря, используя базовую графику и
Хвостовая часть речевого пузыря должна перемещаться в любую точку, как я хочу.
Проблема в том, что когда конечная часть хвоста (заостренная часть) направлена вниз, все работает нормально.
Но когда пузырь перевернут, например, часть пузыря находится внизу, хвостовая часть находится внизу.
вверху две соединенные линии хвостовой части пересекаются друг с другом и образуют букву 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);
}