Шаблон в Python - PullRequest
       10

Шаблон в Python

0 голосов
/ 16 ноября 2018

Я хочу нарисовать ромбовидный узор (используя 1) в матрице нулей 80x80.Первая половина идет очень хорошо, но я получаю только 1001 * s во второй половине.

img = np.zeros((80,80))

def draw_pic(image):
    for i in range(len(image)):
        for j in range(len(image[i])):
            print(int(image[i][j]), end = '')
        print()

def gen_diamond(image):
    ret = np.copy(image)
    for i in range(len(image)):
        for j in range(len(image[i])):
            if (i < len(image)/2 and j >= len(image[i])/2 - (i + 1) and j <= len(image[i])/2 + i):
                ret[i][j] = 1
            if (i > len(image)/2 and j >= len(image[i])/2 - (i + 1)and j <= len(image[i])/2 - i):
                ret[i][j] = 1


    return ret

draw_pic(gen_diamond(img))

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вот решение. Он хорошо работает на четных и нечетных х нечетных сетках изображений.

img = np.zeros((12,12))


def draw_pic(image):
    for i in range(len(image)):
        for j in range(len(image[i])):
            print(int(image[i][j]), end = '')
        print()

def gen_diamond(image):
    ret = np.copy(image)
    for i in range(len(image)):
        for j in range(len(image[i])):
            if (i < len(image)/2 and j >= len(image[i])/2 - (i + 1) and j <= len(image[i])/2 + i):
                ret[i][j] = 1
            if (i >= len(image)/2 and j >= i-len(image[i])/2 and j <= (3/2*len(image[i])-i)-1):
                ret[i][j] = 1


    return ret

draw_pic(gen_diamond(img))

Вывод выглядит так для 12x12

000001100000
000011110000
000111111000
001111111100
011111111110
111111111111
111111111111
011111111110
001111111100
000111111000
000011110000
000001100000

и это для 11 х 11

00000100000
00001110000
00011111000
00111111100
01111111110
11111111111
01111111110
00111111100
00011111000
00001110000
00000100000
0 голосов
/ 16 ноября 2018

Ваша ошибка находится в пределах проверки диапазона в нижней половине. Давайте посмотрим на арифметику для строки 42 ...

        if (i > len(image)/2 and
            j >= len(image[i])/2 - (i + 1) and
            j <= len(image[i])/2 - i):

Подставляя правильные значения, имеем:

        if (42 > 40 and
            j >= 40 - (42 + 1) and
            j <= 40 - 42):

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

row_mid = len(image) // 2
col_mid = len(image[0]) // 2

for row in range(row_mid):
    for col in range(col_mid-row, col_mid+row):
        print(row, col)
        ret[row, col] = 1

for tmp in range(row_mid):
    row = len(image) - tmp    # Work from the bottom up
    for col in range(col_mid-tmp, col_mid+tmp):
        ret[row, col] = 1 

Вывод для массива 10x10:

0000000000
0000110000
0001111000
0011111100
0111111110
0000000000
0111111110
0011111100
0001111000
0000110000

Я доверю тебе, чтобы скорректировать граничные условия. : -)

...