alves077 Posted October 12, 2013 at 08:03 AM Report #528642 Posted October 12, 2013 at 08:03 AM 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
thoga31 Posted October 12, 2013 at 04:04 PM Report #528668 Posted October 12, 2013 at 04:04 PM 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!
Pedro C. Posted October 12, 2013 at 04:26 PM Report #528671 Posted October 12, 2013 at 04:26 PM 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.
thoga31 Posted October 12, 2013 at 04:41 PM Report #528673 Posted October 12, 2013 at 04:41 PM 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!
alves077 Posted October 13, 2013 at 08:35 AM Author Report #528722 Posted October 13, 2013 at 08:35 AM 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
thoga31 Posted October 13, 2013 at 02:13 PM Report #528764 Posted October 13, 2013 at 02:13 PM 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!
alves077 Posted October 15, 2013 at 08:35 PM Author Report #529095 Posted October 15, 2013 at 08:35 PM 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
thoga31 Posted October 15, 2013 at 09:24 PM Report #529106 Posted October 15, 2013 at 09:24 PM 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!
Pedro C. Posted October 16, 2013 at 02:13 PM Report #529209 Posted October 16, 2013 at 02:13 PM 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.
thoga31 Posted October 16, 2013 at 04:12 PM Report #529257 Posted October 16, 2013 at 04:12 PM 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 😄 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now