दो CG बिंदुओं के बीच की दूरी कैसे ज्ञात करें?


84

जब हम UIScrollView में दो उंगलियों के साथ मल्टीटच करते हैं, तो हमें दो CG अंक मिलते हैं। मैं उनके बीच की दूरी का पता लगाना चाहता हूं। फिर जब हम फिर से पिंच (अंदर या बाहर) करेंगे, तो हमें फिर से दो अंक मिलेंगे। फिर इन दो बिंदुओं के बीच फिर से दूरी का पता लगाने के बाद, मैं यह तय करना चाहता हूं कि मैंने अंदर या बाहर चुटकी ली है या नहीं। अगर मैंने इसमें चुटकी ली है, तो निश्चित रूप से नई दूरी कम होगी और इसके विपरीत।

लेकिन पता नहीं कैसे तुलना करने के लिए 2 बिंदुओं के बीच की दूरी के लिए एक सटीक माप खोजने के लिए? क्या किसी को इस बारे में विचार है?


स्विफ्ट 4 के लिए मेरा जवाब देखें जो दो CGPointएस के बीच की दूरी को खोजने के लिए 5 अलग-अलग तरीकों से पता चलता है ।
इमानौ पेटिट

जवाबों:


125

के बीच की दूरी p1और p2:

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

एक समारोह में रखो:

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))
}

पृष्ठभूमि: पायथागॉरियन प्रमेय

यदि आपको केवल गणना करने की आवश्यकता है कि अंकों के बीच की दूरी बढ़ती है या घटती है, तो आप sqrt () को छोड़ सकते हैं जो इसे थोड़ा तेज़ कर देगा।


32
क्या इसके लिए कोई सुविधा विधि नहीं है?
SpacyRicochet

22
कम्प्यूटेशनल ज्यामिति स्वयंसिद्ध # 1: यदि आप दूरी की तुलना कर रहे हैं , तो sqrt () ऑपरेशन की लागत को उकसाने की कोई आवश्यकता नहीं है।
क्यूईडी

4
@SpaceyRicochet विधियां हाइपफेक और ccpDistance हैं। नीचे उत्तर देखें।
rmp251

@QED इससे पहले कि आप वर्गमूल का मान लें या दूरी की गणना के एक मध्यवर्ती चरण से परे एक नाम या महत्व है?
एलेन

@AllenHumphreys कुछ भी नहीं है, मैं दूर की तुलना में अधिक काव्य का पता है ।
QED

188

कर्ण की गणना करने के लिए आप hypot()या hypotf()फ़ंक्शन का उपयोग कर सकते हैं । दो बिंदु दिए p1और p2:

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

और बस।


4
यदि स्विफ्ट का उपयोग किया जाए तो यह दूरी = हाइपफेट (फ्लोट (p1.x) - फ्लोट (P2.x), फ्लोट (p1.y) - फ्लोट (P2.y))
nwales

6
आपका मतलब हैlet distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
औसत जो

6
आपका मतलब let distance = hypot(p1.x - p2.x, p1.y - p2.y)स्विफ्ट 2.1 से है
Cemen

यह फ़ंक्शन वास्तव में यही कारण है कि मैंने इस प्रश्न को खोजा।
केलिन


15

स्विफ्ट 4 के साथ, आप दो CGPointउदाहरणों के बीच की दूरी पाने के लिए प्लेग्राउंड कोड के बाद 5 में से एक चुन सकते हैं ।


1. डार्विन sqrt(_:)फ़ंक्शन का उपयोग करना

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()विधि का उपयोग करना

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. CGFloat squareRoot()विधि और कोर ग्राफिक्स pow(_:_:)फ़ंक्शन का उपयोग करना

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. कोर ग्राफिक्स hypot(_:_:)फ़ंक्शन का उपयोग करना

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. कोर ग्राफिक्स hypot(_:_:)फ़ंक्शन और CGFloat distance(to:)विधि का उपयोग करना

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
स्विफ्ट 3 में भी काम करता है।
क्लार्क

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));
}

यदि आप cocos2d का उपयोग कर रहे हैं

float distance = ccpDistance(point1, point2);

2
ऐसा प्रतीत होता है कि ccpDistance cocos2d का हिस्सा है, कोर का हिस्सा नहीं है। पाइथागोरस प्रमेय से बचने के लिए इसे शामिल करना संभवतः ओवरकिल है।
वोक्स

3

मैंने यह लिखा है, मैं इसका बहुत उपयोग करता हूं:

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

इस तरह से कॉल करें:

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

मैं आमतौर पर cocos2d का उपयोग करता हूं, लेकिन मैं अभी भी कुछ कार्यों के लिए अपने स्वयं के फ़ंक्शन का उपयोग करता हूं क्योंकि जब मैं सीख रहा था तो मैंने "आधिकारिक" उच्च आदेश कार्यों की खोज करने के बजाय सरल सामान के लिए अपने स्वयं के कार्यों का एक गुच्छा लिखा था, और इसके अतिरिक्त मैं एक नहीं हूं कार्यों का बड़ा प्रशंसक (vars, vars), मुझे पसंद है [self functions vars और: var]


1
क्या यह sqrt (pow (P2.x-p1.x, 2) + pow (P2.y-p1.y, 2) नहीं होना चाहिए)? पी 2 की दूसरी घटना।
संजय चौधरी

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

और आप इसका उपयोग कैसे करते हैं:

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

0

यदि आप दो बिंदुओं के बीच की पूर्ण दूरी मान प्राप्त करना चाहते हैं तो आप (Cocos2d के लिए) का उपयोग कर सकते हैं:

float distance = abs(ccpDistance(point1, point2));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.