Я был бы очень признателен, если бы кто-нибудь мог помочь мне найти более быстрое решение моей проблемы.
Вот сценарий: - У меня есть многоугольник точек с плавающей запятой, который я хочу сопоставить с сеткой. Ячейки сетки могут быть разной ширины и высоты, а не однородными, как показано на моем изображении. то есть прямоугольный.
Я пытался использовать рисование изображений, но он использует только целые числа. Преобразование чисел с плавающей запятой в целые означает, что мне нужно увеличить число с плавающей запятой и удалить десятичное число, чтобы сохранить некоторую точность, но рисование изображения не будет работать с большим многоугольником точек.
Есть ли более красноречивый и быстрый способ получить массив единиц (синий) для заполненной области многоугольника и нулей (красный) для остальных. Я немного читал о сетчатой сетке, но не понимаю, как это может быть полезно для этого сценария.
Большое спасибо
Результаты кода
cols = 4
rows = 4
points = [[1535116L, 1725047L], [1535116L, 2125046L], [-464884L, 2125046L], [-464884L, 125046L]]
bbCut = getPythonBoundBox(points)
cutWidth = bbCut[1][0]-bbCut[0][0]
scale = float(cutWidth) / float(rows)
###Center data to origin
for p in range(len(points)):
points[p][0] -= (bbCut[1][0] - bbCut[0][0])/2
points[p][1] -= (bbCut[1][1] - bbCut[0][1])/2
points[p][0] /= scale
points[p][1] /= scale
##move points to Zero
bbCut = getPythonBoundBox(points)
for p in range(len(points)):
points[p][0] -=bbCut[0][0]
points[p][1] -=bbCut[0][1]
pointToTuple= []
for p in range(len(points)):
pointToTuple.append((points[p][0], points[p][1]))
imgWidth = float(rows)
imgHeight = float(cols)
img = Image.new('L', (int(imgWidth), int(imgHeight)), 0)
draw = ImageDraw.Draw(img)
draw.polygon(pointToTuple, fill=1)
array = np.reshape(list(img.getdata()), (cols, rows))
############This is the result from the array############
##If you compare this array to the coloured scaled image ive have drawn
##its missing a 1 on the second value in the first row
##and another 1 on the second row 3rd value
##I'm assuming there is some parsing happening here with float to int?
array([1, 0, 0, 0])
array([1, 1, 0, 0])
array([1, 1, 1, 1])
array([1, 1, 1, 1])
#########################################################
def getPythonBoundBox(points):
bigNumber = 10e10
xmin = bigNumber
xmax = -bigNumber
ymin = bigNumber
ymax = -bigNumber
g = []
a = len(points)
for i in xrange(a):
if points[i][0] < xmin: xmin = points[i][0]
if points[i][0] > xmax: xmax = points[i][0]
if points[i][1] < ymin: ymin = points[i][1]
if points[i][1] > ymax: ymax = points[i][1]
p1 = [xmin,ymin]
g.append(p1)
p2 = [xmax,ymax]
g.append(p2)
return (g)