2012-10-16 18 views
2

我有一個UIBezierPath,我需要得到點y當我設置點x獲取UIBezierPath point.y與集point.x iphone

感謝

+0

問題是比較不清楚。你需要得到的是什麼? 「點x」和「點y」是什麼意思?你在談論一個或兩個不同點的x和y座標嗎?請描述你的問題。 – nullp01nter

+1

是的,我的意思是我怎麼能得到我的路徑在x座標y座標,像http://imageshack.us/photo/my-images/21/iossimulatorscreenshoto.png/ –

回答

3

您需要點之間進行插值。要獲得積分,最簡單的方法是將它們存儲到NSMutableArray中。創建此數組並添加所有CGPoints,同時將它們添加到繪圖例程中的UIBezierPath。如果這不可行,請參閱here關於如何從UIBezierPath中提取點。見代碼如何實現你想要的:

-(float)getYValueFromArray:(NSArray*)a atXValue:(float)x 
{ 
    NSValue *v1, *v2; 
    float x1, x2, y1, y2; 

    // iterate through all points 
    for(int i=0; i<([a count]-1); i++) 
    { 
     // get current and next point 
     v1 = [a objectAtIndex:i]; 
     v2 = [a objectAtIndex:i+1]; 

     // return if value matches v1.x or v2.x 
     if(x==[v1 CGPointValue].x) return [v1 CGPointValue].y; 
     if(x==[v2 CGPointValue].x) return [v2 CGPointValue].y; 

     // if x is between v1.x and v2.x calculate interpolated value 
     if((x>[v1 CGPointValue].x) && (x<[v2 CGPointValue].x)) 
     { 
      x1 = [v1 CGPointValue].x; 
      x2 = [v2 CGPointValue].x; 
      y1 = [v1 CGPointValue].y; 
      y2 = [v2 CGPointValue].y; 
      return (x-x1)/(x2-x1)*(y2-y1) + y1; 
     } 
    } 

    // should never reach this point 
    return -1; 
} 

-(void)test 
{ 
    NSMutableArray *a = [[NSMutableArray alloc] init]; 
    [a addObject:[NSValue valueWithCGPoint:CGPointMake(0, 10)]]; 
    [a addObject:[NSValue valueWithCGPoint:CGPointMake(10, 5)]]; 
    [a addObject:[NSValue valueWithCGPoint:CGPointMake(15, 20)]]; 
    [a addObject:[NSValue valueWithCGPoint:CGPointMake(20, 30)]]; 
    [a addObject:[NSValue valueWithCGPoint:CGPointMake(35, 50)]]; 
    [a addObject:[NSValue valueWithCGPoint:CGPointMake(50, 0)]]; 

    float y = [self getYValueFromArray:a atXValue:22.5]; 
    NSLog(@"Y value at X=22.5 is %.2f", y); 
} 
+0

這將只適用於線段,而不是曲線。 –

+0

是的,但他沒有要求曲線。他最初的問題非常模糊,可能無法回答。但是從他的第一條評論和圖片鏈接中,您可以看到由線條組成的圖表,這就是我提出此解決方案的原因。 – nullp01nter

+1

你很棒@ nullp01nter,它真的幫了我很多好主意,不幸的是我的名聲還不足以投票回答你的答案,所以你可以投我的問題來投你的答案,對不起有點好笑:) –

1

@ nullp01nter感謝您的回答。正是我需要的! :) 這是我的SWIFT版本作爲擴展與陣列與PointXYs:

protocol PointXY { 
    var x : CGFloat { get set } 
    var y : CGFloat { get set } 
} 

extension CGPoint: PointXY { } 

extension Array where Element: PointXY { 
    func getYValue(forX x: CGFloat) -> CGFloat? { 
     for index in 0..<(self.count - 1) { 
      let p1 = self[index] 
      let p2 = self[index + 1] 
      // return p.y if a p.x matches x 
      if x == p1.x { return p1.y } 
      if x == p2.x { return p2.y } 
      // if x is between p1.x and p2.x calculate interpolated value 
      if x > p1.x && x < p2.x { 
       let x1 = p1.x 
       let x2 = p2.x 
       let y1 = p1.y 
       let y2 = p2.y 
       return (x - x1)/(x2 - x1) * (y2 - y1) + y1 
      } 
     } 
     return nil 
    } 
}