Попытка закодировать последовательность Recaman, но проблема с параметрами, которые я передаю для рисования дуги - PullRequest
0 голосов
/ 27 января 2019

Этот вопрос состоит из двух частей:

  1. Логика - построить крутой узор из полукругов Последовательности Рекамана, работает ли моя логика / код?

  2. Проблема, связанная с Pygame. Когда я запускаю свой код, я получаю следующую ошибку:

    pg.draw.arc (экран, черный, [xi, yi, dx, dy], 180,0,1) Ошибка значения: ширина больше радиуса эллипса

Я не вижу, как ширина в конечном итоге становится> радиусом эллипса ... и я изучал это около двух часов, и мне действительно нужна помощь извне. Спасибо!

Мой код:

def recaman():

    sequence = [0]
    limit = 10
    def genNums(n):
        index = 0
        for i in range(1,n):
            if index-i>0 and index-i not in sequence:
                index-=i
                sequence.append(index)
            else:
                index+=i
                sequence.append(index)

    screen = pg.display.set_mode((display_width,display_height),pg.FULLSCREEN)
    tick = 0
    genNums(limit)
    while tick < 1000000:

        zx = display_width//limit
        zy = (display_height/2)//limit
        xi = 0
        yi = 0
        xf = 0
        yf = 0
        curX = 0
        curY = 540
        dx = xf - xi
        dy = yf - yi

        for event in pg.event.get():
            if event.type == pg.QUIT:
                tick = 1000
        screen.fill(white)

        direction = 'down'
        for n in range(0,len(sequence)-1):
            yi = 540
            if n % 2 == 0:
                direction = 'down'
            else:
                direction = 'up'

            if sequence[n+1] > sequence[n]:
                curX += n * zx
                xf = curX
                xi = curX - (n * zx)
            else:
                curX -= n * zx
                xf = curX
                xi = curX + (n*zx)

            if direction == 'up':
                yf = curY - (n*zy)

            if direction == 'down':
                yf = curY + (n*zy)

            p1 = (xi,yi)
            p2 = (xf,yf)
            pg.draw.arc(screen, black, [xi,yi,dx,dy], 180,0,1)

        pg.display.update()
        tick += 1

recaman()

1 Ответ

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

Угол на pygame.draw.arc() должен быть установлен в радианах. Далее ширина и высота прямоугольной области должны быть больше 0.

Части Recaman Sequence - полукруги. Рассчитайте диаметр детали и вычислите нижнюю левую точку начала квадрата, который окружает круг с соответствующим диаметром детали. Нарисуйте верхний полукруг (от 0 до math.pi) или нижний полукруг (от math.pi до 2*math.pi).

import math
line_width = 5
diameter   = abs(dx) + line_width
px         = xi if dx > 0 else xi + dx
py         = display_height/2 - diameter/2.0

if diameter > line_width*2: 
    start_ang = 0 if dy < 0 else math.pi
    end_ang   = start_ang + math.pi + 0.01
    pg.draw.arc(screen, black, [px, py, diameter, diameter], start_ang, end_ang, line_width)

например. кривая с limit = 40:

Полный код:

import pygame as pg
import math

pg.init()

white = (255,255,255)
black = (  0,  0,  0)
display_width, display_height = (800,600)

def recaman():

    sequence = [0]
    limit = 40
    def genNums(n):
        index = 0
        for i in range(1,n):
            if index-i>0 and index-i not in sequence:
                index-=i
                sequence.append(index)
            else:
                index+=i
                sequence.append(index)

    #screen = pg.display.set_mode((display_width,display_height),pg.FULLSCREEN)
    screen = pg.display.set_mode((display_width,display_height))
    tick = 0
    genNums(limit)

    done = False
    while tick < 1000000 and not done:

        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True

        zx = display_width/limit
        zy = (display_height/2)/limit
        xi = 0
        yi = 0
        xf = 0
        yf = 0
        curX = 0
        curY = 500

        screen.fill(white)

        direction = 'down'
        for n in range(0,len(sequence)-1):
            yi = 500
            if n % 2 == 0:
                direction = 'down'
            else:
                direction = 'up'

            if sequence[n+1] > sequence[n]:
                curX += n * zx
                xf = curX
                xi = curX - (n * zx)
            else:
                curX -= n * zx
                xf = curX
                xi = curX + (n*zx)

            if direction == 'up':
                yf = curY - (n*zy)

            if direction == 'down':
                yf = curY + (n*zy)

            p1 = (xi,yi)
            p2 = (xf,yf)

            dx = xf - xi
            dy = yf - yi

            line_width = 5
            diameter   = abs(dx) + line_width
            px         = xi if dx > 0 else xi + dx
            py         = display_height/2 - diameter/2.0

            if diameter > line_width*2: 
                start_ang = 0 if dy < 0 else math.pi
                end_ang   = start_ang + math.pi + 0.01
                pg.draw.arc(screen, black, [px, py, diameter, diameter], start_ang, end_ang, line_width)

        pg.display.update()
        tick += 1

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