Получить точки / пиксели по прямой линии, не зная второй координаты - PullRequest
3 голосов
/ 23 февраля 2020

Я пытаюсь построить функцию, которая простирается от заданной c координаты до заданного угла и проходит по пикселям этой линии, пока не встретит черный пиксели.

Это легко реализовать, если угол составляет, например, 180 градусов. В этом случае поиск будет расширяться только вниз, добавляя 1 к координате столбца в каждой итерации. Однако угол, например, 10 градусов, является более сложным. Поэтому мне, вероятно, нужно математически рассчитать следующий пиксель в позиции пикселя X.

Этот ответ в аналогичном вопросе мне не помог, так как значения на оси у не меняются как ожидается:

import numpy as np
angle = 90*np.pi/180

x = np.arange(0, 10)
y = np.round(np.sin(angle)*x).astype(int)
print([(x, y) for x, y in zip(x, y)])

печатает: [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
Что неверно, поскольку я не ожидаю, что ось Y изменится, учитывая угол 90 градусов.

Ответ на этот другой вопрос требует второй 'конечной' координаты, которой у меня нет.

Наконец, я нашел этот вопрос , который, к сожалению, не имеет правильный ответ. Код в вопросе, кажется, не возвращает смещений, но плавает, значение которого я не уверен. Когда я округляю числа с плавающей точкой, смещения неправильны:

import numpy

def pol2cart(rotdist, cwangle):
    x = rotdist * numpy.cos(cwangle)
    y = rotdist * numpy.sin(cwangle)
    return round(x), round(y)

print(pol2cart(1, 180))

печатает: (-1.0, -1.0), в то время как ожидаемый результат равен (1.0, 0.0)

Однако приведенный выше ответ также даст последовательное смещение при каждая итерация. Это приведет только к трем различным углам (горизонтальный, вертикальный и 45 градусов). Это , а не , что требуется, так как я получу другой угол, затем введу в функцию.

РЕДАКТИРОВАТЬ: Пример ввода

Ниже приведен пример данных изображения. Красная точка указывает на возможную стартовую позицию. Эта точка имеет направление, которое не указано. Если красная точка направлена ​​прямо вниз, то ее направление составляет 180 градусов.

Вложенный словарь содержит координаты каждого пикселя (строка, столбец) и значения цвета: {1: {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 255, 8: 255,...

enter image description here

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Я думаю, вы можете использовать "Алгоритм линии" Брезенхэма , описанный здесь в Википедии.

Я знаю, вы сказали, что у вас есть только начальная точка и нет конечной точки , но вы знаете угол (направление) перемещения и знаете, что самая длинная прямая линия в прямоугольнике - это диагональ, поэтому, если вы представите линию, длиннее диагонали, начиная с начальной точки и направляясь в правильном направлении, вы может генерировать и заканчивать точку за пределами вашего прямоугольника и использовать ее для другого конца в алгоритме Брезенхэма.

0 голосов
/ 23 февраля 2020

Первый предложенный ответ можно исправить, проверив сначала, является ли ваша линия более горизонтальной или более вертикальной, и используя это измерение в качестве измерения итерации (x в вашем примере).

Относительно второго предложенного ответа: Конечно, вы можете рассчитать произвольную дальнюю конечную точку и применить эти алгоритмы для линии с известной начальной и конечной точкой, которую вы упомянули. Затем вы можете перебрать точки, возвращенные этим, чтобы проверить наличие черного пикселя, и даже перезапустить алгоритм, если ни один не был найден, пока вы не достигнете произвольной конечной точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...