두 CG 지점 사이의 거리를 찾는 방법은 무엇입니까?
UIScrollView에서 손가락 두 개로 멀티터치를 하면 CG 포인트 두 개가 나옵니다.나는 그들 사이의 거리를 찾고 싶습니다.그런 다음 다시 핀치를 할 때(안쪽이든 바깥쪽이든), 다시 2점을 얻을 것입니다.그런 다음 이 두 점 사이의 거리를 다시 찾은 후에, 저는 제가 꼬집어 넣었는지 아니면 빼냈는지 결정하고 싶습니다.만약 제가 끼어들었다면, 확실히 새로운 거리는 더 적을 것이고 그 반대일 것입니다.
하지만 비교를 위해 두 지점 사이의 거리를 정확하게 측정하는 방법을 모르십니까?이 일에 대해 알고 있는 사람이십니까?
사용할 수 있습니다.hypot()
또는hypotf()
빗변을 계산하는 함수.2점이 주어집니다.p1
그리고.p2
:
CGFloat distance = hypotf(p1.x - p2.x, p1.y - p2.y);
그리고 이것이 마지막입니다.
사이의 거리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()를 생략하면 조금 더 빨라집니다.
빠른 사용자를 위한
extension CGPoint {
func distance(to point: CGPoint) -> CGFloat {
return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2))
}
}
Swift 4를 사용하면 다음 5개의 Playground 코드 중 하나를 선택하여 두 코드 사이의 거리를 확보할 수 있습니다.CGPoint
예를 들면
다윈 사용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
사용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
사용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
코어 그래픽 사용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
코어 그래픽 사용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
-(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);
저는 이것을 썼고, 자주 사용합니다.
- (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를 사용하지만, 여전히 몇 가지를 위해 제 자신의 함수를 사용합니다. 왜냐하면 제가 배울 때 "공식적인" 고차 함수를 검색하는 것보다 간단한 것을 위해 제 자신의 함수를 많이 썼기 때문입니다. 그리고 추가적으로 저는 함수(바, 바)의 열렬한 팬이 아니기 때문입니다. [자체 함수 변수 및: 바]
#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);
두 점 사이의 절대 거리 값을 찾으려면 다음을 사용할 수 있습니다(Cocos2d의 경우).
float distance = abs(ccpDistance(point1, point2));
언급URL : https://stackoverflow.com/questions/1906511/how-to-find-the-distance-between-two-cg-points
'programing' 카테고리의 다른 글
MariaDB 마스터에서 마스터로의 복제 자동 증분이 순차적이지 않음 (0) | 2023.09.05 |
---|---|
데이터베이스의 결과 페이지화는 어떻게 작동합니까? (0) | 2023.09.05 |
깃 별칭을 삭제하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
Stop-Service Cmdlet이 존재하는 서비스를 열 수 없습니다. (0) | 2023.09.05 |
내 앱을 위해 갤러리(SD 카드)에서 이미지를 선택하는 방법은 무엇입니까? (0) | 2023.09.05 |