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

Ios 使用Bezier路径识别绘制的文本,ios,cocoa-touch,ios5,ios4,Ios,Cocoa Touch,Ios5,Ios4,我使用贝塞尔路径为绘制文本编写以下代码。 现在,我的任务是如何识别使用Beizer路径绘制的文本。 例如,如果我画“苹果”,那么我的标签将显示“你画了苹果” @实现视图 { UIBezierPath*路径; UIImage*增量图像; CGPoint-pts[5]; uint ctr; } -(id)initWithFrame:(CGRect)帧 { self=[super initWithFrame:frame]; 如果(自我){ [自设置多点触控:否]; 路径=[UIBezierPath b

我使用贝塞尔路径为绘制文本编写以下代码。
现在,我的任务是如何识别使用Beizer路径绘制的文本。
例如,如果我画“苹果”,那么我的标签将显示“你画了苹果”

@实现视图
{
UIBezierPath*路径;
UIImage*增量图像;
CGPoint-pts[5];
uint ctr;
}
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
[自设置多点触控:否];
路径=[UIBezierPath bezierPath];
}
回归自我;
}
-(无效)触摸开始:(NSSet*)触摸事件:(UIEvent*)事件
{
ctr=0;
UITouch*touch=[触摸任何对象];
pts[0]=[触摸位置查看:自];
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件
{
UITouch*touch=[触摸任何对象];
CGP点=[触摸位置视图:自];
ctr++;
pts[ctr]=p;
如果(ctr==4)
{
pts[3]=CGPointMake((pts[2].x+pts[4].x)/2.0,(pts[2].y+pts[4].y)/2.0);
[路径移动点:pts[0]];
[path addCurveToPoint:pts[3]控制点1:pts[1]控制点2:pts[2];
UIGraphicsBeginImageContextWithOptions(self.bounds.size,是,0.0);//
如果(!递增图像)
{
UIBezierPath*rectpath=[UIBezierPath-bezierPathWithRect:self.bounds];
[[UIColor whiteColor]setFill];
[路径填充];
}
[增量图像绘制点:CGPointZero];
[[UIColor blackColor]设定行程];
浮动速度=0.0;
对于(int i=0;i<3;i++)
{
浮点dx=pts[i+1].x-pts[i].x;
浮点dy=pts[i+1].y-pts[i].y;
速度+=sqrtf(dx*dx+dy*dy);
} 
#定义福吉系数100
浮动宽度=福吉系数/速度;
[路径设置线宽:宽度];
[路径笔划];
incrementalImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
[自我设置需要显示];
[路径移除所有点];
分[0]=分[3];
pts[1]=pts[4];
ctr=1;
}
}
-(void)drawRect:(CGRect)rect
{
[IncrementalImageDrawinRect:rect];
}
-(void)touchesend:(NSSet*)toucheevent:(UIEvent*)event
{
[自我设置需要显示];
}
-(无效)触控取消:(NSSet*)触控事件:(UIEvent*)事件
{
[self-touchesedend:toucheevent:event];
}
@结束

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


这里有一个这样的答案来回答你在

检测字母区域变化中的问题:除了字母“i”(小写)之外,英语字母都是“连接”的,因此如果笔划区域的水平间距大于第一个笔划长度的33%(即所绘制字符的高度或宽度),我认为可以安全地假设您已经创建了一个新的字母(因此存在缺口)

检测字母本身:我会制作一张字母共同特征的图表(比如画字母需要多少笔划、多少垂直线、多少水平线、多少“点”、多少斜线、多少曲线等等)直到通过查看整个属性列表,系统地检测出唯一绘制的字母

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

应该需要不到一天的时间O:)

@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