通过添加两个 CGPoints 的距离来找到 CGPoint
Posted
技术标签:
【中文标题】通过添加两个 CGPoints 的距离来找到 CGPoint【英文标题】:Finding CGPoint by adding into distance of two CGPoints 【发布时间】:2011-03-23 01:30:09 【问题描述】:我有两个 CGPoints A 和 B。A 和 B 之间的距离可以用 ccpDistance(A,B) 找到。
有了这些信息,我需要通过将小距离添加到 A-B 的距离中,以编程方式找到 X 的 CGPoint(x,y)。 A-B 可以在水平、垂直、对角线或任何方向上连接线。目的是延长假想线并在其末端找到一个点。
在 ios 的 Box2D 中是否可行?如果是,那么如何?
X Y X
/ . \
/ . \
B .B
/ \
/ \
/ \
/ \
A A
【问题讨论】:
【参考方案1】:使用以下函数(将其放入您的.h
文件之一):
static inline CGPoint
ccpLineExtend(const CGPoint v1, const CGPoint v2, const CGFloat extension)
double angle = atan2(v2.y - v1.y, v2.x - v1.x);
return ccp(v2.x + extension * cos(angle), v2.y + extension * sin(angle));
【讨论】:
非常感谢。对于第一个人物来说,它就像魅力一样。它没有像图 2 那样考虑反向角度。它在虚线距离处给出 Y 点。我非常希望您也可以为此提供解决方案。 @WJK:你确定你计算对了吗?因为ccpLineExtend(ccp(3, 0), ccp(0, 4), 5.0)
的简单测试给出了正确的-3.0, 8.0
.. 三角公式不可能是错误的。哦对了,如果你想在 Box2D 中使用它,别忘了将 x 和 y 分量除以 PTM_RATIO
你是对的。是直三角。仅在 90-135 度之间的角度发生在我身上。可能是因为我加载了许多计算,所以一些值可能会影响它。谢谢。
其他一些值影响了 lineExtend,现在已经解决了。再次感谢:)【参考方案2】:
我建议以下不使用任何三角函数的方法。我想这比 Lukman 的建议要快,但我没有测量时间。
static inline CGPoint ccpLineExtend(const CGPoint from, const CGPoint to, const CGFloat factor)
return CGPointMake(from.x + factor * (to.x - from.x), from.y + factor * (to.y - from.y));
factor = 1.0
表示结果点等于点to
。 factor = 2.0
表示结果点与from
的距离是to
的两倍。
【讨论】:
【参考方案3】:@Lars 的回答对我来说是最好和最简单的。这是 Swift 4 版本:
let newPoint = CGPoint(x: origin.x + factor * (end.x - origin.x), y: origin.y + factor * (end.y - origin.y))
如果你有当前的距离,你可以加减它或者通过计算完全改变它:
let factor = newDistance/currentDistance
就我而言,我有一个使用扩展从 CGPoint 到 CGPoint 的距离计算器:
extension CGPoint
func distance(to point: CGPoint) -> CGFloat
let x = self.x - point.x
let y = self.y - point.y
return sqrt(pow(x, 2) + pow(y, 2))
【讨论】:
以上是关于通过添加两个 CGPoints 的距离来找到 CGPoint的主要内容,如果未能解决你的问题,请参考以下文章
获取嵌套在 UIScrollView 中的 UIImageView 中两个 CGPoints 之间的距离
如何通过 Sprite Kit 中的 CGPoints 数组制作动画 - Swift