使用 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)