ピクセルの観点から考えるべきではありません。座標は浮動小数点値です。の幾何学的点は(x,y)
、ピクセルである必要はまったくありません。実際、ピクセルは座標系の四角形であると考える必要があります。
これは、「終点の x ピクセル前」が実際には意味をなさないことを意味します。ピクセルが長方形の場合、水平方向に移動する場合と垂直方向に移動する場合では、「x ピクセル」の量が異なります。そして、それ以外の方向に進むと、それが何を意味するのかを判断するのはさらに難しくなります。
やろうとしていることに応じて、概念をピクセル単位で翻訳するのは簡単かもしれませんし、そうでないかもしれません。ただし、反対のことを行い、ピクセルの観点から考えるのをやめて、現在ピクセルの用語で表現しているすべてを非ピクセルの用語に変換することをお勧めします。
また、ピクセルが正確に何であるかはシステムに依存し、一般に、システムにクエリを実行できる場合とできない場合があることに注意してください (特に、Retina ディスプレイや解像度に依存しないすべての機能などを考慮する場合)。
編集:
質問を編集したようですが、「ポイント」は「ピクセル」よりも正確ではありません。
ただし、実行可能な解決策を提供しようとします。少なくとも、問題を適切な用語で再定式化すると、実行可能になります。
正しく定式化された質問は、次のようになります。
2 つの点A
とB
デカルト空間と距離が与えられたとき、とを通る直線上にあるdelta
点の座標は?線分 BC の長さは?C
C
A
B
delta
その質問に対する解決策は次のとおりです。
// 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 とデルタ)。
また、読みやすくするためにコーディングしたことにも注意してください (コンパイラはとにかく最適化できるはずです)。必要に応じて、自由に再コーディングしてください。