识别使用Bezier路径绘制的文本

时间:2013-12-12 05:53:30

标签: ios cocoa-touch ios5 ios4

我使用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

2 个答案:

答案 0 :(得分:1)

我不确定您是否对使用开源代码感兴趣,但您可以尝试GLGestureRecognizer

以下是stack-Overflow

中对您的问题的一个答案

答案 1 :(得分:1)

检测字母区域的变化:除了字母“i”(小写)外,英文字母都是“已连接”,因此如果笔画区域的水平间距大于33%第一个笔划的长度(即正在绘制的字符的高度或宽度),我认为假设你创建了一个新字母(因此是间隙)是安全的。

自己检测字母:我会制作一个字母常见特征图表(比如绘制它们需要多少笔画,有多少垂直线,多少条水平线,多少“点” ,有多少条有角度的线条,多少条曲线等等,直到您可以通过遍历整个属性列表系统地检测哪个字母是唯一的。

检测笔划类型:要检测笔划的方向(水平,垂直,对角线),只需检查起始X / Y(touchesBegan)和结束X / Y(touchesEnded)并与之比较if语句。要检测一个点只是测量长度与高度相比,它们应该大致相同(即一个圆圈)...另一个可接受的方法是touchesBegan和一个touchesEnded被调用但不是touchesMoved被调用(一个tap是一个点),到检测笔划是线条还是曲线使用起点和终点之间的距离公式,并将其与绘制的实际量(距离)进行比较(如果是,则可以跟踪touchesMoved中+=变量的变化)实际绘制的数量超过距离公式的30%我会说可以安全地假设绘制曲线而不是线(如字母C中所示),您还可以通过跟踪曲线来检测曲线弯曲的方向最左边和/或更右边的点(x-val)并将其与起始或结束的x-val点进行比较!

应该不到一天O :)