最初の Point 構造体があるとしましょう:
Point start = new Point(1, 9);
そして私の2番目:
Point end = new Point(4, 9);
開始と終了の間のすべてのポイントを取得したい。たとえば、配列に 2,9 と 3,9 が必要です。.NET には、このために何かが組み込まれていますか?
これが私がやったことです。@Cody Gray がコメントで述べたように、線には無限の点があります。したがって、取得するポイントの数を指定する必要があります。
マイラインクラス:
public class Line {
public Point p1, p2;
public Line(Point p1, Point p2) {
this.p1 = p1;
this.p2 = p2;
}
public Point[] getPoints(int quantity) {
var points = new Point[quantity];
int ydiff = p2.Y - p1.Y, xdiff = p2.X - p1.X;
double slope = (double)(p2.Y - p1.Y) / (p2.X - p1.X);
double x, y;
--quantity;
for (double i = 0; i < quantity; i++) {
y = slope == 0 ? 0 : ydiff * (i / quantity);
x = slope == 0 ? xdiff * (i / quantity) : y / slope;
points[(int)i] = new Point((int)Math.Round(x) + p1.X, (int)Math.Round(y) + p1.Y);
}
points[quantity] = p2;
return points;
}
}
使用法:
var line = new Line(new Point(10, 15), new Point(297, 316));
var points = line.getPoints(20);
これにより、2 つのエンドポイント間 (包括的) に等間隔に配置された 20 ポイントの Point 配列が返されます。それが役立つことを願っています!
ポイント間にポイントがないため、このための組み込み関数はありません。数学的には、2 点間に直線があります。Computer-Graphics に関して言えば、線はアンチエイリアス処理される可能性があるため、完全な整数に丸められません。
すべての整数を間に作成する高速な方法を探しているなら、Bresenhams-Line-Algorithm があなたの選択になると思います。ただし、これは .NET に組み込まれていないため、自分でコーディングする必要があります (またはマシュー ワトソンの実装を使用します)。
http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
それを行うためのさらに高速なアルゴリズムがありますが、私は Bresenham を選びます。