我使用Bezier路径编写下面的代码来绘制文本 现在,我的任务是如何识别使用Beizer Paths绘制的文本 例如,如果我画“Apple”,那么我的Label将显示“U Have Drawn Apple”。
@implementation NaiveVarWidthView
{
UIBezierPath *path;
UIImage *incrementalImage;
CGPoint pts[5];
uint ctr;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setMultipleTouchEnabled:NO];
path = [UIBezierPath bezierPath];
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
ctr = 0;
UITouch *touch = [touches anyObject];
pts[0] = [touch locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self];
ctr++;
pts[ctr] = p;
if (ctr == 4)
{
pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0);
[path moveToPoint:pts[0]];
[path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]];
UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0); //
if (!incrementalImage)
{
UIBezierPath *rectpath = [UIBezierPath bezierPathWithRect:self.bounds];
[[UIColor whiteColor] setFill];
[rectpath fill];
}
[incrementalImage drawAtPoint:CGPointZero];
[[UIColor blackColor] setStroke];
float speed = 0.0;
for (int i = 0; i < 3; i++)
{
float dx = pts[i+1].x - pts[i].x;
float dy = pts[i+1].y - pts[i].y;
speed += sqrtf(dx * dx + dy * dy);
}
#define FUDGE_FACTOR 100
float width = FUDGE_FACTOR/speed;
[path setLineWidth:width];
[path stroke];
incrementalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self setNeedsDisplay];
[path removeAllPoints];
pts[0] = pts[3];
pts[1] = pts[4];
ctr = 1;
}
}
- (void)drawRect:(CGRect)rect
{
[incrementalImage drawInRect:rect];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self setNeedsDisplay];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesEnded:touches withEvent:event];
}
@end
答案 0 :(得分:1)
我不确定您是否对使用开源代码感兴趣,但您可以尝试GLGestureRecognizer。
中对您的问题的一个答案答案 1 :(得分:1)
检测字母区域的变化:除了字母“i”(小写)外,英文字母都是“已连接”,因此如果笔画区域的水平间距大于33%第一个笔划的长度(即正在绘制的字符的高度或宽度),我认为假设你创建了一个新字母(因此是间隙)是安全的。
自己检测字母:我会制作一个字母常见特征图表(比如绘制它们需要多少笔画,有多少垂直线,多少条水平线,多少“点” ,有多少条有角度的线条,多少条曲线等等,直到您可以通过遍历整个属性列表系统地检测哪个字母是唯一的。
检测笔划类型:要检测笔划的方向(水平,垂直,对角线),只需检查起始X / Y(touchesBegan)和结束X / Y(touchesEnded)并与之比较if语句。要检测一个点只是测量长度与高度相比,它们应该大致相同(即一个圆圈)...另一个可接受的方法是touchesBegan和一个touchesEnded被调用但不是touchesMoved被调用(一个tap是一个点),到检测笔划是线条还是曲线使用起点和终点之间的距离公式,并将其与绘制的实际量(距离)进行比较(如果是,则可以跟踪touchesMoved中+=
变量的变化)实际绘制的数量超过距离公式的30%我会说可以安全地假设绘制曲线而不是线(如字母C中所示),您还可以通过跟踪曲线来检测曲线弯曲的方向最左边和/或更右边的点(x-val)并将其与起始或结束的x-val点进行比较!
应该不到一天O :)