0

我想找到两组坐标点之间的每个整数坐标点。

例如,我需要 (2,15) (6,15) 之间的坐标。它应该给我 (3,15) (4,15) (5,15) 。我找不到执行此操作的任何数学公式或 c++ 代码。

我想要连接 X 和 Y 恰好是整数的两个点的线上的所有坐标

(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 恰好是整数的两个点的线上的所有坐标:

首先,正如另一位海报指出的那样,您需要将其放在以下表格中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

如果您需要有效地绘制点,请使用 Bresenham 算法或中点线算法。

如果您只需要积分,那么:

将点之间的线表示为y = mx + c

初始化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 回答