Как получить координаты линии с нуля? - PullRequest
0 голосов
/ 03 мая 2019

Для начала я хочу сказать, что это не вопрос, связанный с синтаксисом, а скорее вопрос, связанный с теорией (также я работаю с Java, но вопрос / ответ должен быть одинаковым независимо от языка.).Я хочу функцию, которая имеет параметры x1, y1, x2, y2 (которые являются целыми числами).Функция возьмет их и отредактирует двумерный массив (также целочисленный) с именем pixelData [] [].Каждая координата, которую занимает линия, будет добавлена ​​в pixelData в следующем формате: pixelData [x] [y];

Например: если функция работала правильно, и я вызвал ее со следующими параметрами:

int pixelData[][][];
pixelData = new int[10][10]; //grid size of 10x10;

x1 = 1;
y1 = 1;
x2 = 3;
y2 = 3;

Функция будет помещать следующие значения в пиксельные данные:

pixelData[1][1] = 1;
pixelData[2][2] = 1;
pixelData[3][3] = 1;

Для математики мой первоначальный подход состоял в том, чтобы взять абсолютное значение x1-x2 и абсолютное значение y1-y2и поместите их в int с именами xLength и yLength соответственно.Тогда я бы сохранил соотношение двух (xLength / yLength) в двойном значении xyRatio.Тогда для каждого движения xyRatio x существует 1 движение y.Проблема в том, что это работает только для нескольких углов линий и в основном просто дает неточные координаты.Например, если отношение меньше 1, будет изменяться 0 при открытии оси x каждый раз, когда изменяется ось y, и другие подобные проблемы.Если бы кто-то мог дать мне формулу или какую-то помощь, это было бы здорово.

Если вам нужно какое-то разъяснение по этому вопросу, просто спросите.Заранее спасибо!

PS Мне известна функция drawLine, но я не хочу просто рисовать линию, я хочу отображать каждую координату.Если существует существующая функция, которая делает то, что мне нужно, ПОЖАЛУЙСТА, сообщите мне об этом.

-Ampck

1 Ответ

1 голос
/ 03 мая 2019

Вам нужен какой-то алгоритм для растеризации линий .

Например, ищите самый популярный алгоритм * Брезенхема

Реализация от Код Розетты (заменить plot заполнением записи массива)

private void drawLine(Graphics g, int x1, int y1, int x2, int y2) {
        // delta of exact value and rounded value of the dependent variable
        int d = 0;

        int dx = Math.abs(x2 - x1);
        int dy = Math.abs(y2 - y1);

        int dx2 = 2 * dx; // slope scaling factors to
        int dy2 = 2 * dy; // avoid floating point

        int ix = x1 < x2 ? 1 : -1; // increment direction
        int iy = y1 < y2 ? 1 : -1;

        int x = x1;
        int y = y1;

        if (dx >= dy) {
            while (true) {
                plot(g, x, y);
                if (x == x2)
                    break;
                x += ix;
                d += dy2;
                if (d > dx) {
                    y += iy;
                    d -= dx2;
                }
            }
        } else {
            while (true) {
                plot(g, x, y);
                if (y == y2)
                    break;
                y += iy;
                d += dx2;
                if (d > dy) {
                    x += ix;
                    d -= dy2;
                }
            }
        }
    }
}
...