web-dev-qa-db-ja.com

2つのCGPoint間の距離を計算する

2つのCGPoints間の距離を計算する必要があります。 thisthis を参照しましたが、わかりません。

26
iCoder86

さて、あなたが参照するものも含めて、完全なコードはどこですか

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]

距離は可変距離です。

ここで何が起こっているのですか?

  1. それではまず、2つのポイントを作成します...
  2. 次に、ポイントのx座標間の距離を求めます。
  3. ここで、y座標間の距離を求めます。
  4. これらの長さは三角形の2つの辺であり、実際は脚であり、斜辺を見つける時間です。つまり、c ^ 2 = a ^ 2 + b ^ 2を計算して、斜辺をsqrt((xDist ^ 2)+(yDist ^ 2))。 xDist ^ 2 =(xDist * xDist)。同様に:yDist ^ 2 =(yDist * yDist)

CGPointを距離にすることはできません。距離にはxとyのコンポーネントはありません。たった1つの数字です。

CGPointが測定単位であると考える場合(たとえば、フィートは測定単位です)、そうではありません。

52
Dair

私はこれを手作業で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に配置すると、プレーヤーが指を動かしすぎて「タップ」できないため、プレーヤーが触れたオブジェクトを選択せず​​に、代わりにスクロールすることができます。周りのオブジェクト。

スケールについては、網膜ディスプレイがあるかどうか、およびデバイスのサイズに基づいている必要があります(通常の画面ではユーザーの指として5つの「ポイント」の物理的な距離であるため、網膜ディスプレイの場合は2で割ります)。各ポイントは4ピクセルであるため、Retinaディスプレイ画面では10ピクセルとして表示されます。これにより、プレーヤーがRetinaディスプレイをタップするのが非常に困難な状況に陥ります(これは一般的な見落としです) )

22
redux

おそらく、距離ではなく、p1からp2へのベクトル(またはdifference)が必要なようです。

const CGPoint p1 = {10, 10};
const CGPoint p2 = {510, 310};

const CGPoint diff = {p2.x - p1.x, p2.y - p1.y} // == (CGPoint){500, 300}
20
Andrew Pouliot

短い答え

_CGPoint p1, p2; // Having two points
CGFloat distance = hypotf((p1.x-p2.x), (p1.y-p2.y));
_

より長い説明

_p1_と_p2_の2つのポイントがある場合、heightwidthの違いを見つけるのは簡単です(例: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));
_

(元の 参照

14
Firo

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)
11
Chris Vasselli

これだけ...

    float distance = ccpLength(ccpSub(p1,p2));

ここで、p1とp2はCGPointのオブジェクトです

2
mohitdream4u

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