Как искривить хвост воздушного шара (простая форма треугольника)
У меня есть простая треугольная форма (которая служит хвостом воздушного шара), которую я пытаюсь кривить следующим образом:
![enter image description here]()
У меня есть форма хвоста, сохраненная в CGMutablePathRef
, и она выглядит следующим образом:
- (void) drawPaths
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextAddPath(context, self.mutablePath);
CGPathRelease(mutablePath);
CGColorRelease(fillColor);
CGColorRelease(strokeColor);
}
Я пытаюсь сделать это, когда я ввожу некоторый угол в этот алгоритм (скажем, 45 градусов), что хвост вращается и нагибается так же, как на приведенной выше фотографии. Вращение, очевидно, легкое преобразование, но получение его кривой - это то, с чем я борюсь. Я понимаю, что мне, вероятно, нужно использовать: CGPathAddQuadCurveToPoint
однако мне трудно понять, что устанавливать в качестве контрольных точек, и я получаю непредсказуемые результаты. Даже этот блестящий пост оставил меня бессловесным: Учитывая CGPath, как это сделать?
Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Я предполагаю, что у вас есть или может получить координаты x и y как для начальной точки путей - конец путей на баллоне, так и для конечной точки - кончик треугольника - который вы хотите для каждого путей. Позвольте называть исходную точку (xorig, yorig) и конечную точку (xend, yend). Чтобы сделать кривую пути, нам нужно вычислить разумную координационную точку квадратичной кривой, которую мы будем называть (xc, yc). Я считаю, что следующий расчет координат даст вам разумную кривую:
xc = (xorig * 3 + xend) / 4;
yc = (xorig + xend) / 2;
CGPathAddQuadCurveToPoint(mutablePath, NULL, xc, yc, xend, yend).
Чтобы сделать кривую пути по-разному, вы можете варьировать веса xorig и xend при вычислении xc.
Ответ 2
@interface
V : UIView
@end
@implementation
V
{ UIBezierPath* u1;
UIBezierPath* u2;
}
- (void)
awakeFromNib
{ u1 = UIBezierPath.bezierPath;
[ u1
moveToPoint:CGPointMake( 0, 0 )
];
[ u1
addQuadCurveToPoint:CGPointMake( 10, 100 )
controlPoint:CGPointMake( 10, 30 )
];
[ u1
addQuadCurveToPoint:CGPointMake( 20, 0 )
controlPoint:CGPointMake( 10, 30 )
];
u1.lineWidth = 3;
u1.lineJoinStyle = kCGLineJoinBevel;
u2 = UIBezierPath.bezierPath;
[ u2
moveToPoint:CGPointMake( 0, 0 )
];
[ u2
addQuadCurveToPoint:CGPointMake( 50, 60 )
controlPoint:CGPointMake( 10, 30 )
];
[ u2
addQuadCurveToPoint:CGPointMake( 20, 0 )
controlPoint:CGPointMake( 10, 30 )
];
u2.lineWidth = 3;
u2.lineJoinStyle = kCGLineJoinBevel;
}
- (void)
drawRect:(CGRect)p
{ CGContextTranslateCTM( UIGraphicsGetCurrentContext(), 100, 100 );
[ u1 stroke ];
CGContextTranslateCTM( UIGraphicsGetCurrentContext(), 100, 0 );
[ u2 stroke ];
}
@end
Эта программа выводит следующее изображение. Возможно, некоторые подсказки.
![enter image description here]()
Ответ 3
Я бы сначала экспериментировал с PaintCode, чтобы узнать, какой код и переменные я могу придумать.