Нахождение целочисленных координат между 2 точками

Я хотел бы найти каждую целочисленную координатную точку между двумя наборами координатных точек.

Например, мне нужны координаты между (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)

Надеюсь, это лучше объясняет, чего я хочу достичь.

0

Решение

Попытка найти все координаты на линии, соединяющей две точки, где 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 == EndX а также StartY == EndY,

5

Другие решения

Если вам нужно эффективно построить точки, используйте алгоритм Брезенхэма или алгоритм средней точки.

Если вам просто нужны очки, то:

Выразите линию между точками как y = mx + c

инициализировать 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;
}
5

По вопросам рекламы [email protected]