Спираль внутри матрицы - PullRequest
       5

Спираль внутри матрицы

0 голосов
/ 25 сентября 2018

Я пытаюсь заставить матрицу вести себя так, как на этой картинке, которую я сгенерировал с помощью matplotlib, но у меня возникают проблемы с тем, чтобы привести ее в порядок.this picture это код, который я использую, он находит точки во внешнем кольце (четверть круга) и сохраняет массив x, y в X и Y после того, как я расширяю их, чтобы перейтиполный круг и после того, как я пытаюсь заказать все.Моя проблема в том, что я получаю ошибки памяти, когда удаляю reversed () в строках 55 и 61. Вот код, который используется: Как я могу исправить это, чтобы создать спираль, нарисованную красным?Все, что я действительно пытаюсь - это последовательность x, y и количество колец, показанных в строке.

update: я изменил код, чтобы вычислять X, Y, перемещаясь по радиусу тета и thr, но яполучить много дублированных значений х и у.Я не могу понять, как удалить дубликаты, сгенерированные этой техникой, т.е. у меня есть:

X = 0, 1 , 2,3,4,5, 1 , 5

Y = 2, 5 , 4,6,4,5, 5 , 8

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

import matplotlib.pyplot as plt
import numpy as np
from random import randint
from math import sin, cos

width, height = 20, 20
a, b = int((width/2)), int((height/2))
r = int((width/2)-1)
#EPSILON = 1
vert=1
total = 0
datapoints=[]
X=[]
Y=[]


map_ = [[0 for x in range(width)] for y in range(height)]
while(r >=0):
    dataValue= a+r
    horiz=0
    if r <2:
        EPSILON = 1+(r)
    if r >=2 & r<=4:
        EPSILON = 1+(2*r)
    if r >=4:
        EPSILON = 20#1+(2*r/10)+0.3
    # draw the circle
    for T in range(360):
        x = int(cos(T)*r)
        y = int(sin(T)*r)
        if len(X) == 0 or((x is not X[-1]) & (y is not Y[-1])):
            # see if we're close to (x-a)**2 + (y-b)**2 == r**2
            if abs((x)**2 + (y)**2 - r**2) < EPSILON**2:
                if abs(x) < width:
                    if abs(y) <= height:
                        if len(X)!=0:
                            if x==X[-1] & y==Y[-1]:
                                del X[-1]
                                del Y[-1]
                                horiz -= 1
                                total -=1
                        index = 0
                        while(index<len(X)):
                            if (X[index] == x) & (Y[index] == y):
                                del X[index]
                                del Y[index]
                                horiz -= 1
                                total -=1
                            index +=1
                            
                        
                        if T <= 90:
                            X.append(x+a)
                            Y.append(y+b)
                        if T >90 & T <= 180:
                            X.append(-x+a)
                            Y.append(y+b)
                        if T >180 & T <= 260:
                            X.append(-x+a)
                            Y.append(-y+b)
                        if T >260 & T <= 379:
                            X.append(x+a)
                            Y.append(-y+b)
                        else:
                            pass
                        
                        
                        #map_[y][x] = r  ## later here is where the data will go...
                        horiz += 1
                        total+=1

    ## datapoints is data per circle
    datapoints.append(horiz)
    r -= 1
    vert+=1

for m in range(len(X)):
    if(m == 1):    
        map_[Y[m]][X[m]] = 10
    else:
        map_[Y[m]][X[m]] = m
print(datapoints, total)
fig=plt.imshow(map_, interpolation='nearest', cmap=plt.cm.bone)
plt.grid(True)
plt.show()

старый код

import matplotlib.pyplot as plt
import numpy as np
from random import randint

width, height = 20, 20
a, b = int((width/2)), int((height/2))
r = int((width/2)-1)
#EPSILON = 1
vert=1
total = 0
datapoints=[]
X=[[]]
Y=[[]]

##width, height = 11, 11
##a, b = 5, 5
##r = 5
##EPSILON = 2.2

map_ = [[0 for x in range(width)] for y in range(height)]
for i in range(1,r):
    X.append([])
    Y.append([])
while(r >=0):
    dataValue= a+r
    horiz=0
    if r <2:
        EPSILON = 1+(r/10)
    if r >=2 & r<=4:
        EPSILON = 1+(2*r/10)
    if r >=4:
        EPSILON = 1+(2*r/10)+0.3
    # draw the circle
    for y in range(height):
        for x in range(width):
            # see if we're close to (x-a)**2 + (y-b)**2 == r**2
            if abs((x-a)**2 + (y-b)**2 - r**2) < EPSILON**2:
                if(x >= a) & (y <= b):
                    X[r-1].append(x)
                    Y[r-1].append(y)
                
                #map_[y][x] = dataValue  ## later here is where the data will go...
                horiz += 1
                total+=1

    ## datapoints is data per circle
    datapoints.append(horiz)
    r -= 1
    vert+=1
xx = []
yy = []
for i in X:
    print(i)
    try:
        for j in reversed(i):
            i.append(2*a-j)
    except:
        pass
for i in Y:
    try:
        for j in reversed(i):
            i.append(j)
    except:
        pass
for i in X:
    print(i)
    try:
        for j in reversed(i):
            i.append(j)
    except:
        pass
for i in Y:
    try:
        for j in reversed(i):
            i.append(2*a-j)
    except:
        pass

for i in reversed(X):
    try:
        for j in reversed(i):
            xx.append(j)
    except:
         xx.append(i)
for i in reversed(Y):
    try:
        for j in reversed(i):
            yy.append(j)
    except:
        yy.append(i)
for i in range(len(xx)): 
    map_[yy[i]][xx[i]] = i

'''
for i in range(len(datapoints)):
    for j in range(datapoints[i]):
        stepper(datapoints[i])
    ##Control verticle
    ## Make sure its 90 deg
    if i == len(datapoints):
        pass
    else:
        stepper(i*(1024)/vert)
'''
print(vert)
print(total)
fig=plt.imshow(map_, interpolation='nearest', cmap=plt.cm.bone)
#CS = ax2.contourf(X, Y, Z, 10, cmap=plt.cm.bone, origin=origin)
#cbar = fig1.colorbar(CS)
#cbar.ax.set_ylabel('verbosity coefficient')

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