答案 0 :(得分:50)
嗯,你提到的东西也是完整的代码:
CGPoint p2; //[1]
CGPoint p1;
//Assign the coord of p2 and p1...
//End Assign...
CGFloat xDist = (p2.x - p1.x); //[2]
CGFloat yDist = (p2.y - p1.y); //[3]
CGFloat distance = sqrt((xDist * xDist) + (yDist * yDist)); //[4]
距离是可变距离。
这里发生了什么:
你不能真正使CGPoint成为距离,距离没有x和y成分。这只是一个数字。
如果您认为CGPoint是一个度量单位(例如,英尺是一个度量单位),则不是。
答案 1 :(得分:22)
我必须手工执行10,000次,所以我为它编写了一个函数并将其粘贴在我个人库中,我总是在新程序的开头转储,所以我忘记它不是大炮。
- (float)distanceBetween:(CGPoint)p1 and:(CGPoint)p2
{
return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}
所以你这样称呼它(说你想知道你的手指移动了多远):
float moveDistance = [self distanceBetween:touchStart and:touchEnd];
这在移动功能以及滚动菜单中的点检查中非常有用:
if([self distanceBetween:touchStart and:touchAt] > 20*scalePoints)
isItATap = FALSE;
在touchesBegan中设置“isItATap”为true,将上面的内容放在touchesMoved中,然后你知道玩家将他们的手指移动得太远,以至于触摸成为“点击”,所以你可以让它不选择玩家触摸的对象和而是滚动对象。
至于比例,这应该取决于你是否有视网膜显示和你所使用的设备大小(视网膜显示除以2,因为常规屏幕上的物理距离为5“点”用户的手指感觉它会在视网膜显示屏上显示为10“像素”,因为每个点都是4个像素,所以你最终会遇到玩家很难点击视网膜显示屏的情况(这是共同的疏忽)
答案 2 :(得分:20)
听起来你可能想要从p1到p2的矢量(或差异)而不是距离。
const CGPoint p1 = {10, 10};
const CGPoint p2 = {510, 310};
const CGPoint diff = {p2.x - p1.x, p2.y - p1.y} // == (CGPoint){500, 300}
答案 3 :(得分:14)
CGPoint p1, p2; // Having two points
CGFloat distance = hypotf((p1.x-p2.x), (p1.y-p2.y));
如果你有两个分p1
和p2
,很明显很容易找到height
和width
之间的差异(例如ABS(p1.x - p2.x)
),但是找到你真正想要的距离的真实表示,你真的想要这个(例如下面的H
)。
p1
|\
| \
| \ H
| \
| \
|_ _ _\
p2
值得庆幸的是,有一个内置宏:hypotf
(或hypot
doubles
):
// Returns the hypothenuse (the distance between p1 & p2)
CGFloat dist = hypotf((p1.x-p2.x), (p1.y-p2.y));
(原reference)
答案 4 :(得分:9)
在Swift中,您可以为CGPoint添加扩展名:
extension CGPoint {
func distance(to point: CGPoint) -> CGFloat {
return sqrt(pow((point.x - x), 2) + pow((point.y - y), 2))
}
}
并像这样使用它:
let distance = p1.distance(to: p2)
答案 5 :(得分:2)
只有这个...
float distance = ccpLength(ccpSub(p1,p2));
其中p1和p2是CGPoint的对象
答案 6 :(得分:1)
Swift 4,Swift 3解决方案
extension CGPoint {
static func distanceBetween(point p1: CGPoint,
andPoint p2: CGPoint) -> CGFloat {
return sqrt(pow((p2.x - p1.x), 2) + pow((p2.y - p1.y), 2))
}
}
答案 7 :(得分:1)
在 Apple 的示例项目中,他们使用了 hypot。这将返回两点之间的假设(距离),如本 answer 中所述。
extension CGPoint {
func distance(from point: CGPoint) -> CGFloat {
return hypot(point.x - x, point.y - y)
}
}
答案 8 :(得分:0)
欧几里得距离到另一个点,使用 Vision api。
从 iOS 14 开始。
import Vision
extension CGPoint {
public func distance(to point: CGPoint) -> Double {
VNPoint(location: self).distance(VNPoint(location: point))
}
}
print(CGPoint(x: 1, y: 1).distance(to: .zero)) // 1.4142135623730951