ras*_*435 0 c++ math polynomial-math
我想找到2组坐标点之间的每个整数坐标点.
例如,我需要(2,15)(6,15)之间的坐标.它应该给我(3,15)(4,15)(5,15).我找不到任何数学公式或c ++代码来做到这一点.
我想要连接两个点的线上的所有坐标,其中X和Y都是整数
(6,15)&(6,17) = (6,16)
Run Code Online (Sandbox Code Playgroud)
坐标形成一个形状,如矩形或十字形,基本思想是获取每组坐标之间的坐标.
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)
Run Code Online (Sandbox Code Playgroud)
希望这能更好地解释我想要实现的目标.
试图找到连接两个点的线上的所有坐标,其中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);
Run Code Online (Sandbox Code Playgroud)
现在迭代:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
此代码未经过测试,如果失败则会失败EndX < StartX,但它应该让您入门.如果有人有更好的比较方法,请告诉我,我会包含它.
编辑添加
这个问题已经被关闭,可能是因为它没有明确说明,但我已经添加了一条线,以显示你需要处理StartX == EndX和StartY == EndY.
如果您需要有效地绘制点,请使用Bresenham算法或中点线算法.
如果你只需要积分,那么:
表示点之间的线 y = mx + c
初始化x为其中一个顶点的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;
}
Run Code Online (Sandbox Code Playgroud)