Làm thế nào để tìm khoảng cách giữa hai điểm CG?


83

Khi chúng tôi thực hiện cảm ứng đa điểm bằng hai ngón tay trong UIScrollView, chúng tôi nhận được hai điểm CG. Tôi muốn tìm khoảng cách giữa chúng. Sau đó, khi một lần nữa chúng ta thực hiện véo (bên trong hoặc bên ngoài), thì chúng ta sẽ lại nhận được hai điểm. Sau đó, sau khi tìm lại khoảng cách giữa hai điểm này, tôi muốn quyết định xem mình chèn vào hay rút ra. Nếu tôi đã chèn ép, chắc chắn khoảng cách mới sẽ ít hơn và ngược lại.

Nhưng không biết làm cách nào để tìm được số đo chính xác cho khoảng cách giữa 2 điểm để làm phép so sánh? Có ai có ý tưởng về điều này?


Xem câu trả lời của tôi cho Swift 4 , trong đó có tới 5 cách khác nhau để tìm khoảng cách giữa hai CGPoints.
Imanou Petit

Câu trả lời:


123

Khoảng cách giữa p1p2:

CGFloat xDist = (p2.x - p1.x);
CGFloat yDist = (p2.y - p1.y);
CGFloat distance = sqrt(xDist * xDist + yDist * yDist);

Đặt một hàm:

func distance(_ a: CGPoint, _ b: CGPoint) -> CGFloat {
    let xDist = a.x - b.x
    let yDist = a.y - b.y
    return CGFloat(sqrt(xDist * xDist + yDist * yDist))
}

Cơ sở: Định lý Pitago

Nếu bạn chỉ cần tính toán xem khoảng cách giữa các điểm tăng hay giảm, bạn có thể bỏ qua sqrt () sẽ nhanh hơn một chút.


32
Không có phương pháp thuận tiện cho việc này?
SpacyRicochet

22
Tiên đề hình học tính toán # 1: nếu bạn đang so sánh khoảng cách, thì không cần phải trả chi phí cho phép toán sqrt ().
QED

4
@SpaceyRicochet có các phương thức là pseudf và ccpDistance. Xem câu trả lời bên dưới.
rmp251

@QED Giá trị trước khi bạn lấy căn bậc hai có tên hoặc ý nghĩa nằm ngoài bước trung gian để tính khoảng cách không?
allenh

@AllenHumphreys tôi không biết gì thi vị hơn bình phương khoảng cách .
QED

187

Bạn có thể sử dụng hàm hypot()hoặc hypotf()để tính cạnh huyền. Cho hai điểm p1p2:

CGFloat distance = hypotf(p1.x - p2.x, p1.y - p2.y);

Và đó là nó.


4
nếu sử dụng nhanh chóng của nó khoảng cách = hypotf (Float (p1.x) - Float (p2.x), phao (p1.y) - Float (p2.y))
nwales

6
ý bạn làlet distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
Joe trung bình

6
bạn có nghĩa là let distance = hypot(p1.x - p2.x, p1.y - p2.y)kể từ khi Swift 2.1
Cemen

Chức năng này thực sự là lý do tại sao tôi tìm kiếm câu hỏi này.
kelin

29

Đối với người dùng nhanh

extension CGPoint {
    func distance(to point: CGPoint) -> CGFloat {
        return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2))
    }
}

Đó là một giải pháp thực sự tốt đẹp! Hoạt động tốt!
gundrabur

15

Với Swift 4, bạn có thể chọn một trong 5 mã Playground sau để xác định khoảng cách giữa hai CGPointphiên bản.


1. Sử dụng sqrt(_:)hàm Darwin

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    let xDistance = lhs.x - rhs.x
    let yDistance = lhs.y - rhs.y
    return sqrt(xDistance * xDistance + yDistance * yDistance)
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

2. CGFloat squareRoot()Phương pháp sử dụng

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    let xDistance = lhs.x - rhs.x
    let yDistance = lhs.y - rhs.y
    return (xDistance * xDistance + yDistance * yDistance).squareRoot()
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

3. Sử dụng CGFloat squareRoot()phương pháp và pow(_:_:)chức năng Đồ họa lõi

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    return (pow(lhs.x - rhs.x, 2) + pow(lhs.y - rhs.y, 2)).squareRoot()
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

4. Sử dụng hypot(_:_:)chức năng Core Graphics

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    return hypot(lhs.x - rhs.x, lhs.y - rhs.y)
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

5. Sử dụng hypot(_:_:)chức năng và CGFloat distance(to:)phương pháp Core Graphics

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    return hypot(lhs.x.distance(to: rhs.x), lhs.y.distance(to: rhs.y))
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

1
Hoạt động trong Swift 3 quá.
ThisClark,

12
-(float)distanceFrom:(CGPoint)point1 to:(CGPoint)point2
{
CGFloat xDist = (point2.x - point1.x);
CGFloat yDist = (point2.y - point1.y);
return sqrt((xDist * xDist) + (yDist * yDist));
}

Nếu bạn đang sử dụng cocos2d

float distance = ccpDistance(point1, point2);

2
Có vẻ như ccpDistance là một phần của cocos2d, không phải là một phần của lõi. Bao gồm nó để tránh định lý pythagore có lẽ là quá mức cần thiết.
Vox

3

Tôi đã viết cái này, tôi sử dụng nó rất nhiều:

- (float) distanceBetween : (CGPoint) p1 and: (CGPoint) p2
{
    return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}

Gọi như thế này:

float distanceMoved = [self distanceBetween touchStart and: touchEnd];

Tôi thường sử dụng cocos2d, nhưng tôi vẫn sử dụng hàm của riêng mình cho một số việc vì khi tôi học, tôi đã viết một loạt các hàm của riêng mình cho những thứ đơn giản hơn là tìm kiếm các hàm bậc cao hơn "chính thức" và ngoài ra, tôi không phải là người hâm mộ lớn của các chức năng (vars, vars), tôi thích [vars tự hàm và: vars]


1
Nó không phải là sqrt (pow (p2.x-p1.x, 2) + pow (p2.y-p1.y, 2))? lần thứ hai xảy ra p2.y thay thế p1.y.
Sanjay Chaudhry

0
#define rw_pointOffset(point1, point2) CGPointMake(point2.x - point1.x, point2.y - point1.y)
#define rw_pointDistance(point1, point2) sqrtf( powf(point2.x - point1.x, 2.0f) + powf(point2.y - point1.y, 2.0f))

Và đó là cách bạn sử dụng nó:

CGPoint offset = rw_pointOffset(view1.center, view2.center);
float distance = rw_pointDistance(view1.center, view2.center);

0

Nếu bạn muốn tìm giá trị khoảng cách tuyệt đối giữa hai điểm thì bạn có thể sử dụng (cho Cocos2d):

float distance = abs(ccpDistance(point1, point2));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.