2

点 A (x,y) から点 B (p,q) までの直線を考えてみましょう。

メソッドCGContextMoveToPoint(context, x, y);はポイント x、y に移動し、メソッドCGContextAddLineToPoint(context, p, q);はポイント A から B に線を描画します。

私の質問は、ラインがカバーするすべてのポイントを見つけることができますか?

実際には、終点 B の x ポイント前の正確な点を知る必要があります。

この画像を参照してください.. ここに画像の説明を入力

上記の行は参照用です。この線は任意の角度を持っている可能性があります。ポイントBの前の行にある5番目のポイントが必要でした。

ありがとうございました

4

3 に答える 3

4

ピクセルの観点から考えるべきではありません。座標は浮動小数点値です。の幾何学的点は(x,y)、ピクセルである必要はまったくありません。実際、ピクセルは座標系の四角形であると考える必要があります。

これは、「終点の x ピクセル前」が実際には意味をなさないことを意味します。ピクセルが長方形の場合、水平方向に移動する場合と垂直方向に移動する場合では、「x ピクセル」の量が異なります。そして、それ以外の方向に進むと、それが何を意味するのかを判断するのはさらに難しくなります。

やろうとしていることに応じて、概念をピクセル単位で翻訳するのは簡単かもしれませんし、そうでないかもしれません。ただし、反対のことを行い、ピクセルの観点から考えるのをやめて、現在ピクセルの用語で表現しているすべてを非ピクセルの用語に変換することをお勧めします。

また、ピクセルが正確に何であるかはシステムに依存し、一般に、システムにクエリを実行できる場合とできない場合があることに注意してください (特に、Retina ディスプレイや解像度に依存しないすべての機能などを考慮する場合)。

編集:

質問を編集したようですが、「ポイント」は「ピクセル」よりも正確ではありません。

ただし、実行可能な解決策を提供しようとします。少なくとも、問題を適切な用語で再定式化すると、実行可能になります。

正しく定式化された質問は、次のようになります。

2 つの点ABデカルト空間と距離が与えられたとき、とを通る直線上にあるdelta点の座標は?線分 BC の長さは?CCABdelta

その質問に対する解決策は次のとおりです。

// Assuming point A has coordinates (x,y) and point B has coordinates (p,q).
// Also assuming the distance from B to C is delta. We want to find the 
// coordinates of C.

// I'll rename the coordinates for legibility.
double ax = x;
double ay = y;
double bx = p;
double by = q;

// this is what we want to find
double cx, cy;

// we need to establish a limit to acceptable computational precision
double epsilon = 0.000001;

if ( bx - ax  <  epsilon   &&   by - ay < epsilon ) {

  // the two points are too close to compute a reliable result
  // this is an error condition. handle the error here (throw
  // an exception or whatever).

} else {

  // compute the vector from B to A and its length
  double bax = bx - ax;
  double bay = by - ay;
  double balen = sqrt( pow(bax, 2) + pow(bay, 2) );

  // compute the vector from B to C (same direction of the vector from
  // B to A but with lenght delta)
  double bcx = bax * delta / balen;
  double bcy = bay * delta / balen;

  // and now add that vector to the vector OB (with O being the origin)
  // to find the solution
  cx = bx + bcx;
  cy = by + bcy;

}

ポイント A と B が近すぎないことを確認する必要があります。そうしないと、計算が不正確になり、結果が予想とは異なります。それepsilonがやるべきことです ( の値を変更したい場合と変更したくない場合がありますepsilon)。

理想的には、 の適切な値epsilonは、 で表現できる最小の数値に関連するのではなく、が座標の大きさの順序で値に与えるdouble精度のレベルに関連しています。double

をハードコーディングepsilonしました。これは、一般的にデータの大きさの順序を事前に知っているため、その値を定義する一般的な方法ですepsilonが、引数の実際の値 (A の座標) からを計算する「適応」手法もあります。この場合、B とデルタ)。

また、読みやすくするためにコーディングしたことにも注意してください (コンパイラはとにかく最適化できるはずです)。必要に応じて、自由に再コーディングしてください。

于 2012-09-27T09:22:25.763 に答える
0

それほど難しいことではありません。線分を数式に変換します。x ピクセルは、B を中心とする円の半径に変換できます。それらが交差する場所を見つけるシステムを作成します。2 つの解が得られます。 A.

于 2012-09-27T09:41:54.103 に答える
0

これはあなたが使用できるコードです

 float distanceFromPx2toP3 = 1300.0;    

 float mag = sqrt(pow((px2.x - px1.x),2) + pow((px2.y - px1.y),2));
 float P3x = px2.x + distanceFromPx2toP3 * (px2.x - px1.x) / mag;
 float P3y = px2.y + distanceFromPx2toP3 * (px2.y - px1.y) / mag;

 CGPoint  P3 = CGPointMake(P3x, P3y);

このリンクをたどることもできます。詳細な説明が表示されます-

他の 2 つのポイントとその角度を使用して 3 番目のポイントを見つける方法

あなたが見つけたいと思うポイントの数を見つけることができます。

于 2012-09-27T10:19:17.623 に答える