(明らかに) 緑の線を赤の線に垂直にしたいので、p1 と p2 の間の角度を計算する必要はありません。ベクトルを 90 度回転させるのは簡単なことです。
p1 と p2 をCGPoint
(またはNSPoint
) 変数として持っていると仮定します。
まず、p1 から p2 へのベクトルを計算しましょう。
CGPoint p1p2 = CGPointMake(p2.x - p1.x, p2.y - p1.y);
次に、p1->p2 ベクトルに垂直なベクトルを計算します。
CGPoint p1p2Perp = CGPointMake(p1p2.y, -p1p2.x);
次に、垂直ベクトルの長さを見つけてみましょう。
CGFloat radius = hypot(p1p2Perp.x, p1p2Perp.y);
円の半径が一定の場合、計算する代わりにそれを使用できることに注意してください。iOS を使用している場合は、hypotf
代わりに を使用しhypot
ます。
これで、座標を長さで割ることにより、垂直ベクトルを「正規化」して長さ 1 にすることができます。
p1p2Perp.x /= radius;
p1p2Perp.y /= radius;
次に、緑の線の希望の長さの半分を掛けます。という名前の定数または変数に、必要な長さの緑色の線があると仮定しますgreenLineLength
。
p1p2Perp.x *= greenLineLength / 2;
p1p2Perp.y *= greenLineLength / 2;
これで、緑の線のパスを作成できます。CGContextRef
私はあなたがという名前の変数にあると仮定しますgc
:
CGContextBeginPath(gc);
CGContextMoveToPoint(gc, p1.x - p1p2Perp.x, p1.y - p1p2Perp.y);
CGContextAddLineToPoint(gc, p1.x + p1p2Perp.x, p1.y + p1p2Perp.y);
好きなようにパスをストロークできます。例えば:
CGContextSetRGBStrokeColor(gc, 0, 1, 0, 1);
CGContextSetLineWidth(gc, 2);
CGContextSetLineCap(gc, kCGLineCapRound);
CGContextStrokePath(gc);