Jump to content
alves077

Usando o turtle

Recommended Posts

alves077

Bom dia,

Estou a fazer umas experiencias no turtle. Sou novo por estas bandas. Tenho uma função que desenha poligno regulares dadas o número lados eo seu comprimento. Já que sabemos que um poligno regular o produto do número de lados pelo angulo é sempre igual a 360, para calcular o angulo de rotação inverto a formula ficando o 360 / numero de lados. O meu problema agora é que tenho que

def poligno_regular(lado,numero_lados,raio):
   angulo_rotacao = 360 / numero_lados
   for i in range(num_lados):
       turtle.forward(lado)
       turtle.right(angulo_rotacao)
   turtle.hideturtle()

Mas agora tenho sempre fazer segundo um raio, alguma dica como defenir o raio? A questão como defino a distancia do centro até ao ponto onde começo a desenhar e seguir sempre essa distância.

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
thoga31

Isso é pura matemática. Precisas de resolver este problema: Dado o raio do polígono r e o nº de lados n, qual é o comprimento de cada lado, d?

Portanto, não poderás dar à função o comprimento do lado uma vez que ela é que tem de o calcular. Não podes definir o raio e o comprimento ao mesmo tempo, uma vez que um é a função do outro. Ou seja, d = f(r, n).

Consegues resolver isto?


Knowledge is free!

Share this post


Link to post
Share on other sites
Pedro C.

Acho que não percebi a totalidade da tua dúvida. No entanto se o que pretendes é enunciação que o thoga31 fez do teu problema basta ires buscar uma qualquer equação à net onde seja calculado o raio. Por exemplo: http://www.mathopenref.com/polygonradius.html (está sobre o título "Radius given the length of a side"). Transforma a equação de maneira a ficares com o raio e número de lados no mesmo lado da igualdade e tens a tua resposta (cuidado que o ângulo que aparece lá é em graus e tenho ideia que as funções do Python costumam trabalhar em radianos).

No entanto deixa-me tentar elaborar sobre o que eu penso que pode ser o teu problema.Tens um ponto x1,y1 a uma distância de um centro x0,y0 (o tal raio) e precisas de fazer uma rotação para calcular a localização do próximo ponto x2,y2. É isto?

Se for o caso considera simplesmente adoptar coordenada polares (ver: http://pt.wikipedia.org/wiki/Coordenadas_polares) cuja localização x,y é dada precisamente pelos parâmetros raio e ângulo.

Nota: as equações gerais partem do principio que a relação é dada por um centro em 0,0. Assim sendo se no for o teu caso então lembra-te de ires somando as diferenças dx,dy aos teus pontos de maneira a preservares os teus centros independentemente da rotação.

Share this post


Link to post
Share on other sites
thoga31

Há uma coisa que tem de ser definida antes de mais nada e antes de grandes contas. @alves077, pretendes informar a função do comprimento do lado ou do raio do polígono?


Knowledge is free!

Share this post


Link to post
Share on other sites
alves077

Boas,

O problema é que tenho os dois dados comigo. Isto é, tenho a função que escrevi no post anterior. Agora pedem-me para desenhar não só uma simples circunferência, que já agora, é desenha com a chamada a função poligno_regular(1,360), ainda sem raio. Mas agora querem que desenha, com a mesma lógica, mas que tenha atenção ao raio.

Penso que a lógica seria primeiro antes de desenhar deslocar a turtle até a uma posição que a partir dai desenha a circunferência com o tal raio em relação ao centro. Mas sinceramente não estou a ver como fazer. Já procurei também algumas formulas, mas nenhum acho que satisfaz bem o pretendido.

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
thoga31

Não podes fornecer à função, ao mesmo tempo, o raio e o comprimento do lado. Se são função uma da outra, não podes dizer que o raio é 5 e o comprimento é 1 para um quadrado - talvez na 35ª dimensão isso venha a ser possível, mas para já estás a trabalhar a 2 dimensões.

Tens de escolher obrigatoriamente um dos seguintes protótipos, ou usar ambos mas de forma independente, dando a opção de fornecer o comprimento ou o raio.

def poligono(lados, raio=1):
def poligono(lados, comprimento=1):

Ou então fazes algo que pessoalmente não aprecio muito:

def poligono(lados, comprimento=1, raio=1):
   # se ambos o comprimento e raio foram definidos, tomas um deles como prioridade e ignoras o outro, calculando-o.

Eu vou dar uma ajuda, uma vez que a resolução deste problema exige algum math-fu, não é muito avançado mas acho que neste caso não vale a pensa estar a fazer-te esperar e ler imensa documentação.

Para um polígono de n lados e com raio r, o comprimento do seu lado d é dado por: d = r * sqrt(2 - 2 * cos(360º / n)). Uma vez que em Python os ângulos são em radianos, tens de usar math.radians(360/n) (tens de importar a bbiblioteca).

Se estiveres interessado em saber como calculei isto, pergunta. Mas agora já tens a fórmula base que te permite resolver o teu problema. E, como podes ver, o comprimento e o raio são sempre função uma da outra ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
alves077

Eu percebo o que dizes, mas como o exercico era, tendo a função aqui escrevi, de um exercicio anterior mas agora ter atenção ao raio, fiquei confuso...

Mas imaginando que cálculamos o raio, a minha questão é como eu com o turtle, sem usar a opção circle, desenho esse circulo com esse determinado raio. Mesmo deslocando a tartaruga para o ponto x, como eu sei qual é o ponto x para que a circunferência fique com o raio pretendido ?

Não sei se me faço entender....

Obrigado pela ajuda,

alves077

Share this post


Link to post
Share on other sites
thoga31

Pois, não estou a entender a 100%. A turtle anda a partir do ponto anterior, pelo que tudo o que precisas de saber é 1) a distância que tens de andar e 2) quantos graus tens de rodar. A posição inicial da turtle é indiferente, o que interessa é isto mesmo: a turtle não quer saber de ponto X nenhum, apenas quer saber "quantos passos dou" e "para onde me vou virar".

A partir daqui, mais uma vez, o problema poderá ser matemático, pois a rotação e o "andamento" é simples... left ou right, e forward, são os métodos a usar. Tudo o que tens de calcular são os parâmetros destes métodos.


Knowledge is free!

Share this post


Link to post
Share on other sites
Pedro C.

Bem eu não sei como funcionar a turtle. Tens que indicar o ponto para onde se desloca a seguir?

Se sim então vou imaginar uma função com uma argumentação de localização do centro "x,y" e raio "r". (def circulo(x,y,r))

Vou retirar uma meia circunferência na qual começo com ângulo 0 e termino com ângulo 2*pi (ou 360):

import numpy as np # Estou a usar as funções do numpy para o linspace e operacoes trignometricas.
import matplotlib.pyplot as plt # Estou a usar o matplotlib para visualizar a minha circunferência.
r=10 # Isto é o raio.
x=5  # Isto é a localização em x do centro.
y=5  # Isto é a localização em y do centro.
nx=[] # Isto é a lista onde vão estar guardadas todas as localização X ao longo da circunferência.
ny=[] # Isto é a lista onde vão estar guardadas todas as localização Y ao longo da circunferência.
for i in np.linspace(0,2*np.pi,360):  # Por cada ângulo de de 2*pi a dividir por 360 (mas presta atenção a este 360, eu explico a seguir porquê).
 nx.append(x+r*np.cos(i))   # Acrescento a nova posição X
 ny.append(y+r*np.sin(i))   # Acrescento a nova posição Y

plt.plot(nx,ny)  # Mostro as linhas da circuferência
plt.scatter(nx,ny)  # Mostro os pontos das localizações calculadas.
plt.show()   # Mostro o gráficos
print nx  # Passo os resultados para a consola.
print ny

Agora, nos comentários deste código eu pedi para tomares particular atenção ao número de pontos que aparece no linspace (360). Este número indicar o número de pontos calculados linearmente (lin space) entre o minimo e máximo e neste caso o número de vertices em que o último coincide com o primeiro. Portanto se eu meter nesse número de pontos 5 o que me vai aparecer no gráfico é um quadrado, se eu meter 6 vai-me aparecer um pentagono, 7 um hexagono (e por ai adiante...).

Tudo isto para dizer (mais uma vez...) se o que tu pretendes é ter estes poligonos regulares com base num raio e centro o ideal será as coordenadas polares em que no fundo um circulo é nada mais que um poligono regular com "n" lados tão alto que os vertices não sejam perceptiveis (mais lados, mais resolução).

Apesar de tudo isto não é a única solução nem pouco mais ou menos. Podes utilizar a fórmula do círculo normal se não quiseres meter os ângulos à mistura (x**2+y**2=r**2), por exemplo.

Share this post


Link to post
Share on other sites
thoga31

A turtle anda literalmente numa janela, e tal como uma tartaruga, não salta mas anda. Não é "teletransportada" por um qualquer milagre. Portanto, partindo de um ponto inicial, a turtle terá de percorrer n vezes uma distância d, e entre cada vez tem de rodar 360/n graus (a justificação matemática fica para depois).

Como queremos um polígono bonito, vamos considerar que o ponto inicial da turtle está num ponto tal que a tangente da circunferência no qual o polígono está circunscrito é horizontal. Para tal, deveremos começar com uma rotação de 180/n graus, pois ela começa sempre por andar "em frente" (na horizontal, da esquerda para a direita). A partir daqui, com um ciclo for, vamos andar uma distância d e rodando. Exemplo:

turtle.left(angulo / 2)  # estes métodos usam graus e não radianos!
for i in range(n):
   turtle.forward(d)
   turtle.left(angulo)
turtle.exitonclick()
Se adicionar um circle para ver a circunferência respectiva, e considerar que a função tem o seguinte protótipo...
def poligono(n, r=120):
... e chamar a função desta forma...
poligono(15)
...então teremos um output deste género:

https://dl.dropboxusercontent.com/u/30172141/P@P/desafios/arquimedes2.png

Os valores d e angulo... eu já os disse :D

Este problema é muito mais matemático do que de programação em si mesma. Os métodos são simples, as contas a realizar é que são mais chatas.


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.