6

私は2つの既知のポイントを持つ1つのラインを持っています:

PointF p2_1 = new PointF();
p2_1.X = 100; // x1
p2_1.Y = 150; // y1

PointF p2_2 = new PointF();
p2_2.X = 800; // x2
p2_2.Y = 500; // y2

float dx = p2_2.X - p2_1.X;
float dy = p2_2.Y- p2_1.Y;

float slope = dy / dx; // slope m
float intercept = p2_1.Y - slope * p2_1.X; // intercept c 
// y = mx + c

左 (または右) に 10 ピクセルを 1 行 (x1、y1) に反復処理したいと思います。

ここに画像の説明を入力

赤い点は、私が処理したいものです。例:

for (int i = 10; i > 0; i--)
{
   // start with distant coordinates
   PointF new_point = new Point(); // (grab x,y, coords accordingly)
   // repeat until I'm at (x1, y1)
}

これらの座標を反復するにはどうすればよいですか?

4

2 に答える 2

3

垂直ベクトルは次の形式になります: [-dy dx] ここで、[dx dy] は現在のベクトルです。垂直ベクトルを取得したら、それを正規化 (単位長) してから、設定した量だけ繰り返すことができます。

float perp_dx = -dy / Math.sqrt(dy*dy+dx*dx); //normalized
float perp_dy = dx /Math.sqrt(dy*dy+dx*dx); //normalized

for(int i =0; /*logic here*/){
 float new_x = perp_dx * i + start_x;
 float new_y = perp_dy * i + start_y;
}
于 2013-04-11T19:10:45.443 に答える
2

特定の直線に垂直な直線の傾きは、特定の直線の傾きの負の逆数に等しくなります。

与えられた直線の傾きは(y2-y1) / (x2-x1)

したがって、赤い線の傾きは = - 1 / [(y2-y1) / (x2-x1)]

したがって、この直線上の各 i 番目の点には座標 (xi, yi) があり、ここで

  (yi - y1) / (xi - x1)  = - 1 / (y2-y1) / x2-x1)

(x1, y1) から離れた 1 ピクセルの固定距離の倍数です。

   (yi-y1) * (yi-y1) +  (xi-x1) * (xi-x1) =  i * i

私がすることは、このインクリメント ベクトル (dx, dy) が赤い線上の各ポイントに対して、またはそれらの間で何であるかを計算し、10 回反復するループでそのインクリメントを追加し続けることです。

于 2013-04-11T19:08:43.673 に答える