蓝牙绘图应用程序xcode 6中的贝塞尔曲线

问题描述 投票:0回答:1

我正在研究蓝牙LE绘图应用程序。我有它所以当我在第一个设备上绘制一条线时,各个点之间会绘制贝塞尔曲线。我让应用程序将这些点的各种x和y位置发送到接收设备,我可以在其上绘制线条。但是我希望接收图形是弯曲的,因为现在点之间的线是直的。

这是我在发送设备上使用贝塞尔曲线绘制线条的代码。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    ctr = 0;
    UITouch *touch = [touches anyObject];
    pts[0] = [touch locationInView:self.tempImage];
    lastPoint = [touch locationInView:tempImage];
}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

   UITouch *touch = [touches anyObject];
    CGPoint p = [touch locationInView:self.tempImage];
    currentPoint = [touch locationInView:tempImage];
    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); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment
        [path moveToPoint:pts[0]];
        [path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2]

        [self draw2];


        // replace points and get ready to handle the next segment
        pts[0] = pts[3];
        pts[1] = pts[4];
        ctr = 1;
    }
     NSLog(@"ctr:%d",ctr);
    lastPoint = currentPoint;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

    [path removeAllPoints];
    ctr = 0;

    UIGraphicsBeginImageContext(self.tempImage.frame.size);

    [self.imageView.image drawInRect:CGRectMake(0,0, self.imageView.frame.size.width, self.imageView.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
    [self.tempImage.image drawInRect:CGRectMake(0,0, self.tempImage.frame.size.width, self.tempImage.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];

    self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    self.tempImage.image = nil;
    UIGraphicsEndImageContext();

}

- (void)draw2
{
    UIGraphicsBeginImageContext(self.tempImage.frame.size);
    [self.tempImage.image drawInRect:CGRectMake(0, 0, self.tempImage.frame.size.width, self.tempImage.frame.size.height)];

    pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment
    [path moveToPoint:pts[0]];
    [path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2]

    [[UIColor blackColor] setStroke];
        [path setLineWidth:1.0];

    [path stroke];

    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);

    //    CGContextStrokePath(UIGraphicsGetCurrentContext());
    self.tempImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempImage setAlpha:1.0];
   UIGraphicsEndImageContext();
    }
}

然后我用这段代码发送x,y坐标

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic
{

    ax =  lastPoint.x;
    ay = lastPoint.y;
xString = [NSString stringWithFormat:@"%f",ax/see];
    textView.text = xString;
    yString = [NSString stringWithFormat:@"%f",ay/see];
    textView3.text = yString;
NSString *stringOne = self.textView.text;
    NSString *stringTwo = [stringOne stringByAppendingString:@","];
    NSString *stringThree = [stringTwo stringByAppendingString:self.textView3.text];
self.dataToSend = [stringEleven dataUsingEncoding:NSUTF8StringEncoding];

    [self.peripheralManager updateValue:dataToSend forCharacteristic:self.transferCharacteristic onSubscribedCentrals:nil];
self.sendDataIndex = 0;

    // Start sending
    [self sendData];
}

在接收设备上,我使用此代码来获取x,y坐标

NSArray *coorArray = [stringFromData componentsSeparatedByString:@","];
    firstString = [coorArray objectAtIndex:0];
    secondString = [coorArray objectAtIndex:1];
 x = firstString.intValue;
    message2.text = secondString2;
    y = secondString.intValue;
CGPoint currentPoint2 =  CGPointMake(x, y) ;

这是我用来绘制点之间的代码,我尝试使用相同的代码绘制上面的贝塞尔曲线,但我最终得到从(0,0)向各个点辐射的线,我试图将ctr值发送到接收设备,然后将它们插入公式,但我得到了一些非常奇怪的线条,具体取决于我在设备1上绘制原始形状的速度有多快或多慢。任何想法都将非常感激。

UIGraphicsBeginImageContext(tempImage.frame.size);
    [tempImage.image drawInRect:CGRectMake(0,0,tempImage.frame.size.width, tempImage.frame.size.height)];
    [imageView.image drawInRect:CGRectMake(0,0,imageView.frame.size.width, imageView.frame.size.height)];

    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound      );
 else {
        CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [[UIColor clearColor] CGColor]);

        CGContextBeginPath(UIGraphicsGetCurrentContext());


        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), currentPoint2.x, lastPoint.y);
        CGContextClearRect (UIGraphicsGetCurrentContext(), CGRectMake(lastPoint.x, lastPoint.y,20,20));
        CGContextStrokePath(UIGraphicsGetCurrentContext());

        NSLog(@"clearing");
    }

    CGContextBeginPath(UIGraphicsGetCurrentContext());

    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);

    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint2.x, currentPoint2.y);

    CGContextStrokePath(UIGraphicsGetCurrentContext());


   imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    lastPoint  = currentPoint2;
    if(!mouseSwiped) {
        UIGraphicsBeginImageContext(imageView.frame.size);
        [tempImage.image drawInRect:CGRectMake(0, 0,tempImage.frame.size.width, tempImage.frame.size.height)];
        [imageView.image drawInRect:CGRectMake(0, 0,imageView.frame.size.width, imageView.frame.size.height)];
        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1.0);
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        if (mode == DrawingModePen) {
            CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [_drawingPenBlack CGColor]);
        }
        else {
            CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [self.backgroundColor CGColor]);
        }
        CGContextStrokePath(UIGraphicsGetCurrentContext());
        CGContextFlush(UIGraphicsGetCurrentContext());
        imageView.image = UIGraphicsGetImageFromCurrentImageContext();
        tempImage.image = nil;

        UIGraphicsEndImageContext();
    }
- (void) draw3
{

    NSLog(@"this is being called");


    UIGraphicsBeginImageContext(self.tempImage.frame.size);
    [self.tempImage.image drawInRect:CGRectMake(0, 0, self.tempImage.frame.size.width, self.tempImage.frame.size.height)];
 self.tempImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempImage setAlpha:1.0];


    UIGraphicsEndImageContext();


}
xcode6 bluetooth-lowenergy cgcontext uibezierpath
1个回答
0
投票

我想通了

 NSArray *coorArray = [stringFromData componentsSeparatedByString:@"ᴃ"];
    firstString = [coorArray objectAtIndex:0];
    secondString = [coorArray objectAtIndex:1];
    thirdString = [coorArray objectAtIndex:2];
    secondString2 =[coorArray objectAtIndex:3];
     zoomStringIn = [coorArray objectAtIndex:4];
  firstString2 = [coorArray objectAtIndex:5];
   thirdString2 = [coorArray objectAtIndex:6];
 widthStringIn = [coorArray objectAtIndex:7];
    NSLog(@"firststring:%@",firstString);
    NSLog(@"secondString;%@",secondString);
   NSLog(@"thirdString;%@",thirdString);
    NSLog(@"secondString2;%@",secondString2);
    zoom = zoomStringIn.intValue;
    NSLog(@"zoom:%f",zoom);
    x = firstString.intValue*zoom;
    message2.text = secondString2;
    y = secondString.intValue*zoom;

    if ([thirdString isEqualToString:@"clear"]) {
        lastPoint = CGPointMake(x, y);
    }
    else {}
     CGPoint currentPoint2 =  CGPointMake(x, y) ;

    x2 = firstString2.intValue;
    y2 = thirdString2.intValue;

  self.pencilString = thirdString;

这是我用来绘制点之间的线的代码

if ([pencilString isEqualToString:@"clear"]) {
        ctr = 0;
        pts[0] = currentPoint2;






}

else {
    ctr++;
    pts[ctr] = currentPoint2;
}


NSLog(@"ctr:%d",ctr);
 NSLog(@"pts[ctr].x:%f",pts[ctr].x);

NSLog(@"currentPoint.x:%f",currentPoint2.x);
NSLog(@"currentPoint.y:%f",currentPoint2.y);
 self.RealImage.frame = CGRectMake(14-(x2*minus),138-(y2*minus),740*zoom,850*zoom);

self.imageView.frame = CGRectMake(14-(x2*minus),138-(y2*minus),740*zoom,850*zoom);

self.tempImage.frame = CGRectMake(14-(x2*minus),138-(y2*minus),740*zoom,850*zoom);





if ([thirdString isEqualToString:@"black"]) {
    pencilString = @"black";
    [show setBackgroundImage: [UIImage imageNamed:@"black crayon.png"] forState:UIControlStateNormal];show.hidden  = NO;
    [show setTitle:@"Black" forState:UIControlStateNormal];
}






        if (ctr == 4)

    {
        pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment
        [path moveToPoint:pts[0]];
        [path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2]


        [self draw3];






        // replace points and get ready to handle the next segment
        pts[0] = pts[3];
        pts[1] = pts[4];
        ctr = 1;
    }






if ([pencilString isEqualToString:@"clear"]) {



    [path removeAllPoints];
    ctr = 0;
 }


    UIGraphicsBeginImageContext(self.tempImage.frame.size);
    [self.imageView.image drawInRect:CGRectMake(0,0, self.tempImage.frame.size.width, self.tempImage.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
    [self.tempImage.image drawInRect:CGRectMake(0,0, self.tempImage.frame.size.width, self.tempImage.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
    self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    self.tempImage.image = nil;



    UIGraphicsEndImageContext();



















 }
    - (void) draw3
    {

        if ([pencilString isEqualToString:@"clear2"]) {

        UIGraphicsBeginImageContext(imageView.frame.size);
        [[UIColor clearColor] setStroke];
        [imageView.image drawInRect:CGRectMake(0,0,imageView.frame.size.width, imageView.frame.size.height)];




        CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeCopy);



        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);

        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);

        CGContextStrokePath(UIGraphicsGetCurrentContext());

        [path setLineWidth:20.0];


        [path stroke];


        imageView.image = UIGraphicsGetImageFromCurrentImageContext();



    }


    else{
    NSLog(@"this is being called");


    UIGraphicsBeginImageContext(self.tempImage.frame.size);
    [self.tempImage.image drawInRect:CGRectMake(0, 0, self.tempImage.frame.size.width, self.tempImage.frame.size.height)];

    pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment
    [path moveToPoint:pts[0]];
    [path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2]

if ([pencilString isEqualToString:@"black"]) {
        [[UIColor blackColor] setStroke];
        [path setLineWidth:w2*zoom];
    }

    [path stroke];

    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);

    //    CGContextStrokePath(UIGraphicsGetCurrentContext());
    self.tempImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempImage setAlpha:1.0];


    UIGraphicsEndImageContext();

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.