Обновление точек по одному в окне с использованием Zelle graphics.py - PullRequest
0 голосов
/ 24 июня 2018

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

Я был бы рад получить помощь, чтобы сделать его более эффективным.

Это то, что я имел в виду под "как жидкость"

from graphics import *
import time, random

racepoints = {} # {0:[(),()],1:[(),()]}
allpoints = []
races = {}
tx, ty = int(input("x=")), int(input("y="))

def Window():
    global win, sure, spreadSize
    win = GraphWin("Pencere", tx, ty)
    starttime = time.time()
    Start()
    spreadSize = int(input("Başlangıç boyutu?"))
    Spread(spreadSize)
    finishtime = time.time()
    sure = (finishtime - starttime)
    writeTime()
    print("Bitti! Ve {} saniye sürdü!".format(sure))
    time.sleep(5)


def writeTime():
    timefile = open("C:\\Python36\\timefile.py", "r")
    gotta_rewrite = timefile.readlines()
    timefile.close()
    timefile = open("C:\\Python36\\timefile.py", "w")
    gotta_rewrite.append("\n{} ırk, {} genişlik, {}*{} alan, {} saniye sürdü.".format(racecount, spreadSize, tx, ty, sure))
    timefile.seek(0)
    timefile.writelines(gotta_rewrite)
    timefile.close()


def Start():
    global racecount
    racecount = int(input("Kaç tane ırk olsun?"))
    for i in range(racecount):
        randomcolor = color_rgb(random.randrange(255), random.randrange(255), random.randrange(255))
        races[i] = randomcolor
        racepoints[i] = []
        nx = random.randrange(tx)
        ny = random.randrange(ty)
        randomstartpoint = Point(nx, ny)
        randomstartpoint.setFill(races[i])
        randomstartpoint.draw(win)
        allpoints.append((nx, ny))
        (racepoints[i]).append((nx, ny))


def Spread(maxsize):
    defaultsize = maxsize
    for i in range(racecount):
        maxsize = defaultsize
        while maxsize > 0:
            for point in list(racepoints[i]):
                lx, ly = point
                ax, ay = 0, 0
                while ax == 0 and ay == 0:
                    ax = random.choice([-1, 0, 1])
                    ay = random.choice([-1, 0, 1])
                if (lx + ax, ly + ay) not in allpoints:
                    lx += ax
                    ly += ay
                    newpoint = Point(lx, ly)
                    newpoint.setFill(races[i])
                    newpoint.draw(win)
                    (racepoints[i]).append((lx, ly))
                    allpoints.append((lx, ly))
                else:
                    pass
            maxsize -= 1


Window()

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В этот раз я выбрал другой подход по сравнению с моей первоначальной попыткой, заключающейся в том, что это решение в значительной степени опирается на установленную логику для поддержания точек.(Цвета выглядят немного пастельно из-за моего использования win.plot() вместо Point.draw(), но это незначительная деталь реализации)

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

import time
from random import randrange
from collections import defaultdict
from graphics import *

def Window():
    global tx, ty, win

    tx, ty = int(input("x = ")), int(input("y = "))
    race_count = int(input("How many races do you have? "))
    spread_size = int(input("Maximum spread? "))

    win = GraphWin("Window", tx, ty)

    start_time = time.time()

    Start(race_count)
    Spread(spread_size)

    finish_time = time.time()
    time_difference = finish_time - start_time

    print("Done! And it took {} seconds!".format(time_difference))
    writeTime(time_difference, spread_size, race_count)
    time.sleep(5)

def writeTime(sure, spread_size, race_count):
    try:
        with open("timefile.py") as time_file:
            gotta_rewrite = time_file.readlines()
    except FileNotFoundError:
        gotta_rewrite = []

    gotta_rewrite.append("\n{} race, {} width, {} * {} space, {} seconds.".format(race_count, spread_size, tx, ty, sure))

    with open("timefile.py", "w") as time_file:
        time_file.writelines(gotta_rewrite)

def Start(race_count):
    for _ in range(race_count):
        random_color = color_rgb(randrange(255), randrange(255), randrange(255))

        while random_color in races:
            random_color = color_rgb(randrange(255), randrange(255), randrange(255))

        nx, ny = randrange(tx), randrange(ty)
        win.plot(nx, ny, random_color)

        races[random_color].add((nx, ny))

def Spread(spread_size):
    for _ in range(spread_size):
        for color, points in races.items():
            for point in list(points):  # need copy of points as it'll be modified in loop

                candidates = set()

                x, y = point

                for dy in range(-1, 2):
                    for dx in range(-1, 2):
                        candidates.add((x + dx, y + dy))

                candidates = candidates.difference(*races.values())

                if candidates:
                    new_point = candidates.pop()
                    points.add(new_point)

                    nx, ny = new_point

                    if 0 < nx < tx and 0 < ny < ty:  # only draw visible points
                        win.plot(nx, ny, color)

races = defaultdict(set)

Window()

Работа над точками вокруг робина, а не завершение одного и переход на другой, кажется более верной для намерения.Вы можете сравнить ваше новое решение слева с моим, справа, где у них 50 рас:

enter image description here

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

0 голосов
/ 20 августа 2018

Я немного изменил код, так что теперь, если общее количество нарисованных пикселей больше пустых, оно будет проверять координаты нового пикселя на пустых пикселях. Поскольку пустые пиксели (которые готовы к окраске) ​​становятся все меньше и меньше, становится проще и быстрее проверить, можно ли нарисовать новый пиксель. 200 гонок, 25 spreadSize, x = 200, y = 200 было завершено за 512,4622814655304 секунды до его изменения, теперь это 384,0333812236786 секунд. Новая версия:

from graphics import *
import time, random, io

date = "{}.{}.{}".format(time.strftime("%d"),time.strftime("%m"),time.strftime("%Y"))
racepoints = {} # {0:[(),()],1:[(),()]}
allpoints = []
space = []
races = {}
tx, ty = int(input("x=")), int(input("y="))

for i in range(tx+1):
    for a in range(ty+1):
        space.append((i, a))

def Window():
    global win, sure, spreadSize
    win = GraphWin("Pencere", tx, ty)
    Start()
    spreadSize = int(input("Başlangıç boyutu?"))
    starttime = time.time()
    Spread(spreadSize)
    finishtime = time.time()
    sure = (finishtime - starttime)
    writeTime()
    print("Bitti! Ve {} saniye sürdü!".format(sure))
    time.sleep(5)


def writeTime():
    with io.open("C:\\Python36\\timefile.py", "r", encoding="utf-8") as timefile:
        gotta_rewrite = timefile.readlines()
        timefile.close()
    gotta_rewrite.append("\n{} ırk, {} genişlik, {}*{} alan, {} saniye sürdü. {}".format(racecount, spreadSize, tx, ty, sure, date))
    with io.open("C:\\Python36\\timefile.py", "w", encoding="utf-8") as timefile:
        timefile.seek(0)
        timefile.writelines(gotta_rewrite)
        timefile.close()


def Start():
    global racecount
    racecount = int(input("Kaç tane ırk olsun?"))
    for i in range(racecount):
        randomcolor = color_rgb(random.randrange(255), random.randrange(255), random.randrange(255))
        races[i] = randomcolor
        racepoints[i] = []
        nx, ny = 0, 0
        while (nx, ny) == (0,0) or (nx,ny) in allpoints:
            nx = random.randrange(tx)
            ny = random.randrange(ty)
        randomstartpoint = Point(nx, ny)
        randomstartpoint.setFill(races[i])
        randomstartpoint.draw(win)
        allpoints.append((nx, ny))
        (racepoints[i]).append((nx, ny))
        space.remove((nx, ny))


def Spread(maxsize):
    defaultsize = maxsize
    for i in range(racecount):
        maxsize = defaultsize
        while maxsize > 0:
            for point in list(racepoints[i]):
                lx, ly = point
                ax, ay = 0, 0
                while ax == 0 and ay == 0:
                    ax = random.choice([-1, 0, 1])
                    ay = random.choice([-1, 0, 1])
                lx += ax
                ly += ay
                if len(space) > len(allpoints) and (lx, ly) not in allpoints and lx in range(tx) and ly in range(ty):
                    newpoint = Point(lx, ly)
                    newpoint.setFill(races[i])
                    newpoint.draw(win)
                    racepoints[i].append((lx, ly))
                    allpoints.append((lx, ly))
                    space.remove((lx, ly))
                elif len(allpoints) > len(space) and (lx, ly) in space and lx in range(tx) and ly in range(ty):
                    newpoint = Point(lx, ly)
                    newpoint.setFill(races[i])
                    newpoint.draw(win)
                    racepoints[i].append((lx, ly))
                    space.remove((lx, ly))
                else:
                    pass
            maxsize -= 1


Window()
...