2012-10-15 28 views

उत्तर

1

आप आसानी से कैसे बनाने के लिए के कुछ उदाहरण गूगल कर सकते हैं वेब पर बेजियर वक्र। मुझे एक उदाहरण के रूप में यह छोटा tut मिला।

उदाहरण के लिए आप एक करीबी बेजियर वक्र बना सकते हैं निम्नलिखित कोड स्निपेट के साथ:

UIBezierPath* path = [UIBezierPath bezierPath]; 

[path moveToPoint:pt1]; 
[path addLineToPoint:pt2]; 
[path addLineToPoint:pt3]; 

[path closePath]; 

मुझे उम्मीद है कि यह एक शुरुआती बिंदु के रूप में मदद करेगा।

0
UIBezierPath *aPath = [UIBezierPath bezierPath]; 

// Set the starting point of the shape. 
[aPath moveToPoint:CGPointMake(100.0, 0.0)]; 

// Draw the lines. 
[aPath addLineToPoint:CGPointMake(200.0, 40.0)]; 
[aPath addLineToPoint:CGPointMake(160, 140)]; 
[aPath addLineToPoint:CGPointMake(40.0, 140)]; 
[aPath addLineToPoint:CGPointMake(0.0, 40.0)]; 
[aPath closePath]; 
+1

यह सिर्फ सीधी रेखा खींचता है और सवाल का जवाब नहीं देता है। – FiddleMeRagged

0

कृपया इसे आज़माएं।

UIImageView *waterLevel = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,200,200)]; 
UIGraphicsBeginImageContext(waterLevel.frame.size); 
[waterLevel.image drawAtPoint:CGPointZero]; 
//define BezierPath 
UIBezierPath *bezierPath = [UIBezierPath bezierPath]; 


// Set the starting point of the shape. 
[bezierPath moveToPoint:CGPointMake(0, 0)]; 

[bezierPath addLineToPoint:CGPointMake(waterLevel.frame.size.width, 0)]; 
[bezierPath addLineToPoint:CGPointMake(waterLevel.frame.size.width, waterLevel.frame.size.height)]; 
[bezierPath addLineToPoint:CGPointMake(0, waterLevel.frame.size.height)]; 
[bezierPath closePath]; 

bezierPath.lineWidth = 15; 
//set the stoke color 
[[UIColor blackColor] setStroke]; 
//draw the path 
[bezierPath stroke]; 

// Add to the current Graphic context 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextAddPath(context,bezierPath.CGPath); 
waterLevel.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[self.view addSubview:waterLevel]; 
+1

कृपया अपनी समस्या को डाउन-वोट करने से पहले कोड रीग्र्रेडिंग साझा करें। –

+0

बेचारा - खेई gechilo: पी –

3

मुझे पता है कि यह देर हो सकती है, लेकिन सिर्फ सही उत्तर की तलाश करने वाले किसी भी व्यक्ति के लिए। सीधी रेखा खींचने के लिए addLineToPoint का उपयोग करने के बजाय। आप वक्र खींचने के लिए addCurveToPoint का उपयोग कर सकते हैं। जैसे

[bezierPath moveToPoint:CGPointMake(0, 0)]; 
[bezierPath addCurveToPoint:CGPointMake(40, 100) 
       controlPoint1:CGPointMake(20, 0) 
       controlPoint2:CGPointMake(20, 100)]; 
[bezierPath addCurveToPoint:CGPointMake(80, 50) 
       controlPoint1:CGPointMake(60, 100) 
       controlPoint2:CGPointMake(60, 50)]; 

// and you may don't want to close the path 
// [bezierPath closePath]; 

वक्र के नियंत्रण बिंदुओं को चुनने के लिए यह वास्तव में आपके ऊपर है। मैं बस x = last_point_x + 20 का उपयोग करता हूं; y = last_point_y नियंत्रण बिंदु एक के लिए, और x = current_point_x - 20; वाई = current_point_y;

और आप 20 के बजाय अन्य मान का उपयोग करना चाह सकते हैं क्योंकि आपके पास वक्र की विभिन्न सेगमेंट चौड़ाई हो सकती है।

0

आप और अधिक कुशल CGPointFromString विधि का उपयोग कर किया जा सकता है:,

NSArray *pointArray = @[@"{3.0,2.5}",@"{100.0,30.2}", @"{100.0,200.0}", @"{3.0,200.0}"]; 

// draw the path 
UIBezierPath *aPath = [UIBezierPath bezierPath]; 
for (NSString *pointString in pointArray) { 
    if ([pointArray indexOfObject:pointString] == 0) 
     [aPath moveToPoint:CGPointFromString(pointString)]; 
    else 
     [aPath addLineToPoint:CGPointFromString(pointString)]; 
} 
[aPath closePath]; 
7

यह द्वारा प्राप्त किया जा सकता करने के लिए एक छोटे से अधिक सामान्य तरीके उदाहरण के लिए, BEMSimpleLineGraph GitHub Project को देखकर (अधिक जानकारी के लिए देखें: )। यहां मैंने अंक की एक दी गई सूची के माध्यम से एक बेजियर वक्र खींचने के लिए एक विधि निकाली।

हेडर फाइल (BezierLine.h):

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import <CoreGraphics/CoreGraphics.h> 

@interface BezierLine : NSObject 

/* 
Draws a bezier curved line on the given context 
with points: Array of CGPoint values 
*/ 
-(void) drawBezierCurveInContext:(CGContextRef)context withPoints:(NSArray*)points lineColor:(UIColor*)color lineWidth:(CGFloat)lineWidth; 

@end 

कार्यान्वयन (BezierLine.m):

#import "BezierLine.h" 

@implementation BezierLine 

-(void) drawBezierCurveInContext:(CGContextRef)context withPoints:(NSArray*)points lineColor:(UIColor*)color lineWidth:(CGFloat)lineWidth { 
    if (points.count < 2) return; 

    CGPoint CP1; 
    CGPoint CP2; 

    // LINE 
    UIBezierPath *line = [UIBezierPath bezierPath]; 

    CGPoint p0; 
    CGPoint p1; 
    CGPoint p2; 
    CGPoint p3; 
    CGFloat tensionBezier1 = 0.3; 
    CGFloat tensionBezier2 = 0.3; 

    CGPoint previousPoint1; 
    CGPoint previousPoint2; 

    [line moveToPoint:[[points objectAtIndex:0] CGPointValue]]; 

    for (int i = 0; i < points.count - 1; i++) { 
     p1 = [[points objectAtIndex:i] CGPointValue]; 
     p2 = [[points objectAtIndex:i + 1] CGPointValue]; 

     const CGFloat maxTension = 1.0f/3.0f; 
     tensionBezier1 = maxTension; 
     tensionBezier2 = maxTension; 

     if (i > 0) { // Exception for first line because there is no previous point 
      p0 = previousPoint1; 
      if (p2.y - p1.y == p1.y - p0.y) tensionBezier1 = 0; 
     } else { 
      tensionBezier1 = 0; 
      p0 = p1; 
     } 

     if (i < points.count - 2) { // Exception for last line because there is no next point 
      p3 = [[points objectAtIndex:i + 2] CGPointValue]; 
      if (p3.y - p2.y == p2.y - p1.y) tensionBezier2 = 0; 
     } else { 
      p3 = p2; 
      tensionBezier2 = 0; 
     } 

     // The tension should never exceed 0.3 
     if (tensionBezier1 > maxTension) tensionBezier1 = maxTension; 
     if (tensionBezier2 > maxTension) tensionBezier2 = maxTension; 

     // First control point 
     CP1 = CGPointMake(p1.x + (p2.x - p1.x)/3, 
          p1.y - (p1.y - p2.y)/3 - (p0.y - p1.y)*tensionBezier1); 

     // Second control point 
     CP2 = CGPointMake(p1.x + 2*(p2.x - p1.x)/3, 
          (p1.y - 2*(p1.y - p2.y)/3) + (p2.y - p3.y)*tensionBezier2); 


     [line addCurveToPoint:p2 controlPoint1:CP1 controlPoint2:CP2]; 

     previousPoint1 = p1; 
     previousPoint2 = p2; 
    } 

    CGContextSetAllowsAntialiasing(context, YES); 
    CGContextSetStrokeColorWithColor(context, color.CGColor); 
    CGContextSetLineWidth(context, lineWidth); 
    CGContextAddPath(context, line.CGPath); 
    CGContextDrawPath(context, kCGPathStroke); 
} 


@end 

उदाहरण के लिए आप UIGraphicsBeginImageContext का उपयोग कर एक छवि संदर्भ बनाने और पुन: प्राप्त करने से उपयोग कर सकते हैं UIGraphicsGetCurrentContext() के साथ संदर्भ।

अन्यथा आप कोड बदलना और परिणामस्वरूप पथ को कैलियर को असाइन करना चाहते हैं और उसे UIView में जोड़ना चाहते हैं।

उम्मीद है कि इससे मदद मिलती है।