Как добавить цвета в разные области - PullRequest
0 голосов
/ 08 января 2019

Итак, я создал повторяющийся узор, используя два разных дизайна. Теперь проблема заключается в создании цветов, поэтому я должен попросить пользователя выбрать 3 разных цвета и использовать их, чтобы сделать определенные области дизайна цветными. Например, я имею в виду, что если бы я выбрал макет патча 5x5, то первые 2 блока шаблонов по горизонтали и ниже должны быть одного цвета (то есть четыре блока) и т. Д.

РЕДАКТИРОВАТЬ: чтобы устранить путаницу.

  1. Так что, если вы посмотрите на 500x500. введите «5», когда он спросит, какой размер патча вы хотите.

  2. вы должны увидеть два разных рисунка.

  3. все, что я хочу, это x = 0 - x = 200, а y = 0 - y = 200 - синего цвета. Это означает, что все в этой области (под областью я имею в виду все рисунки, которые там есть) должно быть синего цвета. Один и тот же цвет следует использовать для x = 300 до x = 500 и y = от 300 до y = 500.

  4. x = 300 до x = 500 и y = 0 до y = 200 должны быть красного цвета, а x = 0 до x = 200 и y = 300 до y = 500 также должны быть красного цвета.

  5. и все, что осталось, это часть «+» в середине, которая должна иметь третий цвет, зеленый.

  6. https://prntscr.com/m48xxd это то, что я имею в виду под цветами. так что верхний левый и нижний правый одинаковые цвета. верхний правый и нижний левый - те же цвета, а «+» - другой цвет.

5x5 patchwork image

7. https://prntscr.com/m48xzm вот версия 7x7

7x7 patchwork image

Сейчас я просто добавил цвета, чтобы на них было легче смотреть.

Я уже пытался использовать 'getX' и 'getY', но я не могу понять, как это правильно.

from graphics import *

def main():
    global patchWorkSize
    patchWorkSize = int(input("What patchwork size would you like?"))

    if patchWorkSize == 5:
        patchWork5()
    elif patchWorkSize == 7:
        patchWork7()
    elif patchWorkSize == 9:
        patchWork9()
    else:
        print('Only patchwork sizes 5, 7 and 9 are avaliable')




def patchWork5():
    layout()

    for y in range(0,500,100):

        for x in range(0,500,200):

            for l1 in range(0,100,20):
                line = Line(Point(l1+x,0+y), Point(100+x,100-l1+y))
                line.draw(win)
            for l2 in range(100,0,-20):
                line3 = Line(Point(l2+x,100+y), Point(0+x,100-l2+y))
                line3.draw(win)

            for l3 in range(100,0,-20):
                line2 = Line(Point(100+x,0+l3+y), Point(0+l3+x,100+y))
                line2.setFill('red')
                line2.draw(win)
            for l4 in range(0,100,20):
                line4 = Line(Point(0+x,100-l4+y), Point(100-l4+x,0+y))
                line4.setFill('red')
                line4.draw(win)

    for e in range(0,500,100):
        for t in range(100,500,200):
            for o in range(0,500,10):
                for c in range(5,100,10):
                    circle1 = Circle(Point(c+t,5+o+e), 5)
                    circle1.setFill('blue')
                    circle1.draw(win)


def patchWork7():
    layout()

    for y in range(0,700,100):

        for x in range(0,700,200):

            for l1 in range(0,100,20):
                line = Line(Point(l1+x,0+y), Point(100+x,100-l1+y))
                line.draw(win)
            for l2 in range(100,0,-20):
                line3 = Line(Point(l2+x,100+y), Point(0+x,100-l2+y))
                line3.draw(win)

            for l3 in range(100,0,-20):
                line2 = Line(Point(100+x,0+l3+y), Point(0+l3+x,100+y))
                line2.setFill('red')
                line2.draw(win)
            for l4 in range(0,100,20):
                line4 = Line(Point(0+x,100-l4+y), Point(100-l4+x,0+y))
                line4.setFill('red')
                line4.draw(win)

    for e in range(0,700,100):
        for t in range(100,700,200):
            for o in range(0,700,10):
                for c in range(5,100,10):
                    circle1 = Circle(Point(c+t,5+o+e), 5)
                    circle1.setFill('blue')
                    circle1.draw(win)

def patchWork9():
    layout()

    for y in range(0,900,100):

        for x in range(0,900,200):

            for l1 in range(0,100,20):
                line = Line(Point(l1+x,0+y), Point(100+x,100-l1+y))
                line.draw(win)
            for l2 in range(100,0,-20):
                line3 = Line(Point(l2+x,100+y), Point(0+x,100-l2+y))
                line3.draw(win)

            for l3 in range(100,0,-20):
                line2 = Line(Point(100+x,0+l3+y), Point(0+l3+x,100+y))
                line2.setFill('red')
                line2.draw(win)
            for l4 in range(0,100,20):
                line4 = Line(Point(0+x,100-l4+y), Point(100-l4+x,0+y))
                line4.setFill('red')
                line4.draw(win)

    for e in range(0,900,100):
        for t in range(100,900,200):
            for o in range(0,900,10):
                for c in range(5,100,10):
                    circle1 = Circle(Point(c+t,5+o+e), 5)
                    circle1.setFill('blue')
                    circle1.draw(win)

def layout():
    global win

    win = GraphWin('Patchwork',patchWorkSize*100, patchWorkSize*100)
    for i in range(0, patchWorkSize*100,100):
        line = Line(Point(i,0), Point(i, patchWorkSize*100))
        line2 = Line(Point(0,i), Point(patchWorkSize*100, i))


        line.draw(win)
        line2.draw(win)

main()

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я не собираюсь писать все для вас, но код ниже показывает, как выбрать цвет для каждой области на основе ее положения в сетке пэчворка (i и j). Цвет определяется в color_func().

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

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

Этот код все еще кажется мне слишком повторяющимся, и, возможно, его можно сделать более кратким, но я оставлю это и вам ... ;¬)

def main():
#    size = int(input("What patchwork size would you like?"))
#    Hardcoded for testing.
#
#    if size % 2 == 0:
#        raise RuntimeError('patchwork size must be odd')

    patch_work(5)
    print()
    patch_work(7)

def patch_work(n):
    colors = '0', '1', '2'
    mid = n // 2

    # Call color_func() for every possible position in patchwork and
    # prints the results in rows.
    for i in range(n):
        row = []
        for j in range(n):
            row.append(color_func(n, i, j, colors))
        print(''.join(row))

def color_func(n, i, j, colors):
    mid = n // 2

    if i == mid:
        index = 2

    elif i < mid:
        if j < mid:
            index = 0
        elif j == mid:
            index = 2
        elif j > mid:
            index = 1

    elif i > mid:
        if j < mid:
            index = 1
        elif j == mid:
            index = 2
        elif j > mid:
            index = 0

    return colors[index]


if __name__ == '__main__':

    main()

Выход:

00211
00211
22222
11200
11200

0002111
0002111
0002111
2222222
1112000
1112000
1112000
0 голосов
/ 08 января 2019

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

from graphics import *

UNIT = 100

def patchWork(win, size):
    blocks = size // 2

    def hatch_box(x, y):
        for n in range(0, UNIT, UNIT//5):
            line = Line(Point(n + x * UNIT, y * UNIT), Point((x + 1) * UNIT, UNIT - n + y * UNIT))
            line.draw(win)

        for n in range(UNIT, 0, -UNIT//5):
            line = Line(Point(n + x * UNIT, (y + 1) * UNIT), Point(x * UNIT, UNIT - n + y * UNIT))
            line.draw(win)

        for n in range(UNIT, 0, -UNIT//5):
            line = Line(Point((x + 1) * UNIT, n + y * UNIT), Point(n + x * UNIT, (y + 1) * UNIT))
            line.setFill('red')
            line.draw(win)

        for n in range(0, UNIT, UNIT//5):
            line = Line(Point(x * UNIT, UNIT - n + y * UNIT), Point(UNIT - n + x * UNIT, y * UNIT))
            line.setFill('red')
            line.draw(win)

    for y in range(blocks):
        for x in range(blocks):
            hatch_box(x, y)

    for y in range(blocks + 1, 2 * blocks + 1):
        for x in range(blocks + 1, 2 * blocks + 1):
            hatch_box(x, y)

    def draw_circles(x, y):
        for o in range(0, UNIT, UNIT // 10):
            for c in range(0, UNIT, UNIT // 10):
                circle = Circle(Point(c + UNIT // 20 + x * UNIT, o + UNIT // 20 + y * UNIT), UNIT // 20)
                circle.setFill('blue')
                circle.draw(win)

    for y in range(blocks):
        for x in range(blocks + 1, 2 * blocks + 1):
            draw_circles(x, y)
            draw_circles(y, x)

    def draw_cube(x, y):
        cube = Rectangle(Point(x * UNIT, y * UNIT), Point((x + 1) * UNIT, (y + 1) * UNIT))
        cube.setFill('yellow')
        cube.draw(win)

    x = blocks
    for y in range(0, 2 * blocks + 1):
        draw_cube(x, y)
        draw_cube(y, x)

def layout(size):
    win = GraphWin('Patchwork', size * UNIT, size * UNIT)

    for i in range(0, size * UNIT, UNIT):
        Line(Point(i, 0), Point(i, size * UNIT)).draw(win)
        Line(Point(0, i), Point(size * UNIT, i)).draw(win)

    return win

def main():
    patchWorkSize = int(input("What patchwork size would you like? "))

    if patchWorkSize % 2 == 1 and patchWorkSize > 2:
        win = layout(patchWorkSize)

        patchWork(win, patchWorkSize)

        win.getMouse() # pause for click in window
        win.close()
    else:
        print('Only odd sizes 3 or greater are available')

main()

Вы должны иметь возможность изменить UNIT в пределах разумного.

enter image description here

...