使用 set point.x iphone 获取 UIBezierPath point.y

Posted

技术标签:

【中文标题】使用 set point.x iphone 获取 UIBezierPath point.y【英文标题】:Get UIBezierPath point.y with set point.x iphone 【发布时间】:2012-10-16 23:07:12 【问题描述】:

我有一个UIBezierPath,当我设置点 x 时我需要得到点 y

谢谢

【问题讨论】:

这个问题非常不清楚。你需要得到“y点”到底是什么? “x点”和“y点”是什么意思?您是在谈论一个点还是两个不同点的 x 和 y 坐标?请描述您的问题。 是的,我的意思是如何在 x 坐标中获取路径的 y 坐标,例如 imageshack.us/photo/my-images/21/iossimulatorscreenshoto.png 【参考方案1】:

您需要在点之间进行插值。要访问这些点,最简单的方法是将它们存储到NSMutableArray。创建此数组并添加所有 CGPoint,同时将它们添加到您的绘图例程中的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);

【讨论】:

是的,但他没有要求曲线。他最初的问题非常模糊,可能无法回答。但是从他的第一条评论和图片链接中,您可以看到由线条组成的图表,这就是我建议此解决方案的原因。 你很棒@nullp01nter,它真的帮助了我,好主意,不幸的是我的声誉不足以投票给你的答案,所以你能投票给我的问题来投票给你的答案吗,对不起有点好笑:) 很高兴听到我能提供帮助。顺便说一句,我投票赞成你的评论,现在你的声誉已经足够高了。如果你在乎,你现在也可以投票了 :) @JonathanCichon 从曲线开始,您可以查看this post。【参考方案2】:

@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
    

【讨论】:

以上是关于使用 set point.x iphone 获取 UIBezierPath point.y的主要内容,如果未能解决你的问题,请参考以下文章

MySQL5.6中查询多边形包含点情况(ST_ContainsST_Within)

arcgis JavaScript API 点击地图,获取点击的Point(x,y)

安卓获取屏幕分辨率

iphone获取phonegap地理定位始终开启

带有 CGPoint 数据的 NSLog

使用OpenCV复制图像上的某一块区域???