0

2組の座標点の間の各整数座標点を見つけたいと思います。

たとえば、(2,15)(6,15)の間の座標が必要です。それは私に(3,15)(4,15)(5,15)を与えるはずです。これを行う数式やC++コードが見つかりません。

XとYの両方がたまたま整数である2点を結ぶ線上のすべての座標が欲しい

(6,15)&(6,17) = (6,16)

座標は長方形や十字などの形状を形成し、基本的な考え方は、座標の各セット間の座標を取得することです。

Rectabgle Shape
Point [1] : (2, 17)
Point [2] : (2, 15)
Point [3] : (6, 15)
Point [4] : (6, 17)

Points on perimeter : (2, 16), (3, 15), (4, 15), (5, 15), (6, 16), (5, 17), (4, 17), (3, 17)

これが私が達成したいことについてよりよく説明することを願っています。

4

2 に答える 2

7

XとYの両方がたまたま整数である2つの点を結ぶ線上のすべての座標を見つけようとしています。

まず、別のポスターが指摘しているように、これを次の形式で入力する必要がありますy = mx + b

int StartX = 0;
int StartY = 10;
int EndX = 100;
int EndY = 110;

// m = rise / run
float m = 0.0;

if (EndX == StartX || EndY == StartY)
{
    // add code here to handle the trivial cases
    return;
}

int run = EndX - StartX;
int rise = EndY - StartY;
m = ((float) rise) / ((float) run);

// solve for b
// (start with y = mx + b, subtract mx from both sides)
float b = StartY - (m * StartX);

今繰り返します:

// note: assumes EndX > StartX
for (int x = StartX; x <= EndX; ++x)
{
    // solve for y
    float y = (m * x) + b;

    // round to nearest int
    int rounded = (y > 0.0) ? floor(y + 0.5) : ceil(y - 0.5);

    // convert int result back to float, compare
    if ((float) rounded == y)
        printf("(%d, %d)\n", x, rounded);
}

このコードはテストされていません。テストされていない場合は失敗しますがEndX < StartX、開始する必要があります。誰かがより良い比較方法を持っているなら、私に知らせてください、そして私はそれを含めます。

追加するために編集

質問は明確に述べられていなかったためか、クローズされましたが、どこで処理する必要があるかを示す行を追加しましStartX == EndXStartY == EndY

于 2012-10-24T18:46:35.570 に答える
5

ポイントを効率的にプロットする必要がある場合は、ブレゼンハムのアルゴリズムまたは中点ラインアルゴリズムを使用してください。

ポイントだけが必要な場合は、次のようにします。

ポイント間の線を次のように表現しますy = mx + c

x頂点の1つのx座標に初期化します。最初のx座標から他のx座標まで反復し、x必要なポイント数に基づいて増分します。このxのy座標は次のようになります。m*x+c

未テスト、仮定x1 < x2

struct Point {
     double x;
     double y;
};

Point* getPointsBetween(int x1, int y1, int x2, int y2, int numOfPoints) {
    double m = (y2-y1)/(x2-x1);
    double c = y1 - m*x1;

    Point *points = new Point[num];
    double increment = (x2-x1)/numOfPoints);

    for(double i=x1+increment ; i<x2 ; i+=increment) {
        points[i].x = i;
        points[i].y = m*i + c;
    }

    return points;
}
于 2012-10-24T18:55:12.480 に答える