首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用set point.x获取UIBezierPath point.y

用set point.x获取UIBezierPath point.y
EN

Stack Overflow用户
提问于 2012-10-17 07:07:12
回答 2查看 1.5K关注 0票数 2

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-17 19:46:49

您将需要在这些点之间进行插值。要访问点,最简单的方法是将它们存储到NSMutableArray中。创建此数组并添加所有CGPoints,同时在绘图例程中将它们添加到UIBezierPath中。如果无法做到这一点,请参见here,了解如何从UIBezierPath中提取点。有关如何实现您想要的内容,请参阅以下代码:

代码语言:javascript
复制
-(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);
}
票数 3
EN

Stack Overflow用户

发布于 2016-08-03 22:01:31

@nullp01nter感谢你漂亮的回答。这正是我所需要的!:)下面是我的Swift版本,它是带PointXY的数组的扩展:

代码语言:javascript
复制
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
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12924806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档