0

固定サイズの円の中心に線を引きたい。画像を確認してください、それはすべてを説明します。円の中心に P1 があり、円の境界のどこかに P2 があります。P1 は常に固定されたままで、P2 はマウスの動きによって変化し続け、円の境界の任意の点になります。今、私は緑色で示されている固定長の線を描きたいと思っています。(x1,y1) と (x2,y2) を固定距離で見つけたい、P2 が変更されるたびに、P2 に向かって緑の線を引きたい。

ここに画像の説明を入力

希望、画像がすべてを説明しています。要するに、私はフォローする必要があります。

  1. P1 と P2 の間の角度。
  2. 円の中心に角度をつけて一定距離で緑色の線を引きます。

ありがとう

4

2 に答える 2

0

(明らかに) 緑の線を赤の線に垂直にしたいので、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);
于 2012-08-07T05:05:36.783 に答える
0

あなたの質問によると、2 つの間の角度は常に垂直で、90°または π/2 ラジアンです。atan2();を使用して赤いセグメントの角度を取得できます。M_PI_2次に、緑色のものの角度を減算します。

そこから、直径が線分の長さである円の円周上の 2 つの点を見つけようとしています。これを極座標 (r, theta) で考え、デカルト座標 (x, y) に変換できます。

x = (segment_length / 2) * cos(theta)
y = (segment_length / 2) * sin(theta)

に追加M_PIthetaて、他のエンドポイントを取得します。

于 2012-08-07T05:09:53.143 に答える