2

私はいくつかの異なる解決策を試しましたが、今のところ運がありません。

- (CGPoint)contractLineTemp:(CGPoint)point :(CGPoint)circle :(float)circleRadius { 
CGFloat x,y;
x = point.x - circle.x;
y = point.y - circle.y;

CGFloat theta = atan2(x, y);

CGPoint newPoint;

newPoint.x = circle.x + circleRadius * sin(theta);
newPoint.y = circle.y + circleRadius * cos(theta);

return newPoint;
}


- (CGPoint)contractLineTemp:(CGPoint)startPoint :(CGPoint)endPoint :(float)scaleBy {

float dx = endPoint.x - startPoint.x;
float dy = endPoint.y - startPoint.y;

float scale = scaleBy * Q_rsqrt(dx * dx + dy * dy);
return CGPointMake (endPoint.x - dx * scale, endPoint.y - dy * scale);
}

これらのソリューションはどちらも一種の作業です。円の中心に線を引くと、円と正確に交差していることがわかります。

http://www.freeimagehosting.net/le5pi

上記の解決策のいずれかを使用して、角度に応じて円の円周に描画すると、円の中心に向かって移動しなくなります。2番目の画像では、線は円の右端の中央にあり、まっすぐ右に進んでいるはずです。

http://www.freeimagehosting.net/53ovs

http://www.freeimagehosting.net/sb3b2

リンクでごめんなさい。私は現在画像を投稿するのは初めてです。

助けてくれてありがとう。

4

2 に答える 2

5

これをベクトル問題として扱う方が簡単です。2番目のアプローチは近いですが、2点間のベクトルを正しくスケーリングしていません。この場合、正規化されたベクトルを使用する方が簡単ですが、線上の2点間の距離がゼロ以外であると想定する必要があります。

与えられた:

double x0 = CIRC_X0; /* x-coord of center of circle */
double y0 = CIRC_Y0; /* y-coord of center of circle */

double x1 = LINE_X1; /* x-coord of other point on the line */
double y1 = LINE_Y1; /* y-coord of other point on the line */

次に、2点間のベクトルは(vx、vy)です。

double vx = x1 - x0;
double vy = y1 - y0;

(vx、vy)を正規化することで取得できる単位ベクトルを使用する方が簡単です。

double vmag = sqrt(vx*vx + vy*vy);
vx /= vmag;  /* Assumption is vmag > 0 */
vy /= vmag;

これで、線に沿った任意の点は次のように記述できます。

x0 + dist * vx
y0 + dist * vy

ここdistで、は中心からの距離です。CIRC_RADIUS円と線の交点は、中心からの距離でなければなりません。したがって、次のようになります。

double x_intersect = x0 + CIRC_RADIUS * vx;
double y_intersect = y0 + CIRC_RADIUS * vy;
于 2012-08-04T20:28:40.530 に答える
0

シータ、x、yが何であるかについて、慣例の矛盾があるかもしれないと思います。atan2関数は、シータの規則をX軸からYに向かって成長する角度としてとることにより、-pi..piの範囲の値を生成します。ただし、シータをYからXへの角度と見なしています。コードを変更してみてください。

CGFloat theta = atan2(y, x);
CGPoint newPoint;
newPoint.x = circle.x + circleRadius * cos(theta);
newPoint.y = circle.y + circleRadius * sin(theta);

数式は座標系内で一貫していますが、画面/ディスプレイデバイスの座標系と競合している可能性があります。

于 2012-08-04T20:25:16.820 に答える