7

最初の Point 構造体があるとしましょう:

Point start = new Point(1, 9);

そして私の2番目:

Point end = new Point(4, 9);

開始と終了の間のすべてのポイントを取得したい。たとえば、配列に 2,9 と 3,9 が必要です。.NET には、このために何かが組み込まれていますか?

4

4 に答える 4

12

これが私がやったことです。@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 配列が返されます。それが役立つことを願っています!

于 2015-12-07T20:14:07.380 に答える
9

ポイント間にポイントがないため、このための組み込み関数はありません。数学的には、2 点間に直線があります。Computer-Graphics に関して言えば、線はアンチエイリアス処理される可能性があるため、完全な整数に丸められません。

すべての整数を間に作成する高速な方法を探しているなら、Bresenhams-Line-Algorithm があなたの選択になると思います。ただし、これは .NET に組み込まれていないため、自分でコーディングする必要があります (またはマシュー ワトソンの実装を使用します)。

http://en.wikipedia.org/wiki/Bresenham's_line_algorithm

それを行うためのさらに高速なアルゴリズムがありますが、私は Bresenham を選びます。

于 2013-04-17T13:48:21.963 に答える