• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Cybernavigator

Quantos circulos tangentes à volta de um circulo

11 mensagens neste tópico

Boas, passei a noite a matutar nesta coisa, e não consigo perceber, aposto que é uma cena simples que me está a faltar.

Imaginem um circulo com um certo raio.

Eu quero saber quantos circulos à volta dele consigo criar, sabendo eu o raio, o espaço entre eles e o raio de cada circulo.

Vejam esta animação e percebem bem do que estou praqui a falar

http://flashden.net/item/balls-of-light-preloader/10855

tentei relacionar com isto

http://www.actionscript.org/resources/articles/168/3/Dynamic-masking-using-the-drawing-API/Page3.html

mas visto que nem dormi a tentar resolver e sei que não estoua  conseguir por estupidez, vou parar umas horas e esperar que vocês me dêem uma mãozinha :P

obrigado desde já

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sabendo o raio do círculo criado por todos os círculozinhos à volta, tens o perímetro:

2*pi*R

Seja r o raio de cada círculozinho, e s o espaço entre eles, só precisas de fazer:

2*pi*R / (2*r+s)

Ou seja, divides o perímetro do círculo maior pela soma do diâmetro de cada círculo pequeno e o espaço entre os círculos pequenos.

Podes fazer esta aproximação (arco que passa pelo círculozinho e pertence à circunferência maior ser igual ao raio do círculozinho) porque são distâncias muito pequenas.

Não sei se a distância entre os círculos te é dada em arco ou distância em linha recta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro, faz sentido =D

Pá sabendo que o espaço é dado em linha recta como faço para tirar o arco disso? :S essa já me ultrapassa mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Grr, não estou a conseguir.

function addDot(numero,raio,dotRadius,espaçoEntreEles)
{
numero *= espaçoEntreEles;
var x1 = raio*Math.sin(numero*Math.PI/180);
var x2 = raio*Math.sin((numero+dotRadius)*Math.PI/180);
var y1 = raio*Math.cos((numero)*Math.PI/180);
var y2 = raio*Math.cos((numero+dotRadius)*Math.PI/180);
var dot:MovieClip = new MovieClip();
with(dot.graphics)
{
	trace("x: "+(x2+x1)/2+" | y: " + (y2+y1)/2 + " | Num: " + numero) ;
	beginFill(0x000000);
        drawCircle((x2+x1)/2,(y2+y1)/2,dotRadius);
    	endFill();
}
addChild(dot);
dot.x = stage.stageWidth/2;
dot.y = stage.stageHeight/2;
}

traduzindo, o espaço entre eles, não é nada mais que o arco que faz, ha alguma forma de saber quantos circulos sao feitos no minimo para fazer 1 circulo completo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sabendo eu o raio, o espaço entre eles e o raio de cada circulo

Não podes. Se sabes o raio do grande, o espaço entre eles e o raio de cada círculo estás a colocar-te numa situação de erro à partida porque essa combinação pode não ser possível.

Para além disso o que faz sentido é teres o espaçamento dado em unidades do perímetro da circunferência grande, isto é, em arco.

Em relação à aproximação, sim e não, depende do dimensão dos círculos exteriores. Se forem de facto muito pequenos como no exemplo que deste é válida, mas no caso geral não.

Para teres noção de que dimensão é essa (aprox. igual ao diâmetro dos círculos se estes forem mto pequenos) só tens que considerar a tua circunferência grande de raio R e uma pequena de raio r. Por simplicidade faz a grande centrada na origem e a pequena à direita, isto é com (xc=R,yc=0).

circulo.jpg

A ideia é determinar o ângulo entre os dois pontos de intersecção, que, devido à escolha que fiz de posicionamento da circunferência pequena, será 2 * teta. Basta-nos escrever um sistema a duas equações que represente as duas circunferências:

X^2 + Y^2 = R^2  (1)

(X-R)^2 + Y^2 = r^2  (2)

Desenvolvendo (2): X^2 - 2XR + R^2 + Y^2 = r^2 <=> X^2 + Y^2 = r^2 - R^2 + 2XR

Substituindo em (1): r^2 - R^2 + 2XR = R^2 <=> X = (2R^2 - r^2)/(2R)

Podemos reescrever (1): Y = sqrt(R^2 - X^2) = sqrt( R^2 - ((2R^2 - r^2)/(2R))^2)

Já temos (xi,yi) em função de r e R que conhecemos à partida, portanto o teu programa pode calcular estes dois valores. Calcular teta resume-se a fazer o arctg(yi/xi) - presumo que exista alguma biblioteca math ou algo do género que te permita fazer isto.

Tendo o ângulo teta temos 2*teta e podemos, se o quisermos, fazer a relação arco = R * (2*teta) -  assumo que teta foi calculado em radianos.

De qualquer forma, os cálculos podem ser feitos todos à base de espaçamentos angulares. O meu conselho é ter os dois raios e em seguida sugerir um espaçamento angular *mínimo* entre circunferências (denotemo-lo por alfamin, o espaçamento efectivo entre as circunferências será alfa).

Calculas o 2*teta, associado a uma circunferência pequena, e sabes que para N circunferências existem N espaçamentos entre elas.

Então sabes que N*(2*teta + alfa) = 2*pi, obrigatoriamente (Isto é, N = 2*pi / (2*teta + alfa)).

Repara que se definires à partida r, R e ainda alfa como querias fazer, N pode não vir inteiro, o que não é possível, daí eu ter dito que precisas de definir um espaçamento *mínimo* e não o espaçamento *exacto*.

Queremos que, com um espaçamento mínimo de alfamin, tenhamos o máximo número de circunferências N. Para isso fazemos a divisão:

Nmajorante = 2*pi / (2*teta + alfamin) - como alfamin <= alfa, Nmajorante>=N. Basta-nos agora retirar a parte inteira de Nmajorante e obtemos N (o maior N tal que alfa >= alfamin).

Já temos o número de circunferências pretendido N, portanto:

N*(2*teta + alfa) = 2*pi <=> alfa = (2*pi)/N  - 2*teta

Temos agora os parâmetros todos de que necessitamos (2*teta, alfa, r e R, N) para construir a nossa imagem.

pseudo-código:

for(i=0;i<N;i++) {
    angle=i*(2*teta + alfa);
    draw_circle(R*cos(angle),R*sin(angle),r);
}

Repara que é trivial fazer "os pequenos círculos girarem". Para isso bastaria no cálculo de angle acrescentar uma fase phi que fosse mudando ao longo do programa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@pedrosorio,

sim, eu esqueci-me de dizer que a aproximação é razoável para tamanhos pequenos... (Fiquei a pensar de pois de pôr o post nisso e só agora tive tempo de voltar ao pc para colocar lá isso).

E também me esqueci de dizer o que o pedrosorio disse, que o espaçamento devia vir em arco.

Outra coisa, pedrosorio, se a configuração não for possível, sempre podes pegar no resto e dividir pelos espaçamentos (e se for dizima infinita, o olho de quem está a ver não se vai importar :P).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra coisa, pedrosorio, se a configuração não for possível, sempre podes pegar no resto e dividir pelos espaçamentos (e se for dizima infinita, o olho de quem está a ver não se vai importar :P).

Exactamente. Quando calculo Nmajorante a partir de alfamin e coloco a parte inteira em N, usando-o agora para calcular alfa é isso que estou a fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente. Quando calculo Nmajorante a partir de alfamin e coloco a parte inteira em N, usando-o agora para calcular alfa é isso que estou a fazer.

Tavas à espera que eu fosse decifrar toda essa equação em ASCII? :) LOL :P

EDIT: "à espera que eu fosse decifrar" leia-se tentar decifrar e não falhanço em decifrar. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tavas à espera que eu fosse decifrar toda essa equação em ASCII? :P LOL :)

Oh... Pensei que sim... Afinal esta é a secção de matemática... nem que seja ASCII hardcore  :P

EDIT: "à espera que eu fosse decifrar" leia-se tentar decifrar e não falhanço em decifrar. :P

Sempre a defender o seu orgulho lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oh... Pensei que sim... Afinal esta é a secção de matemática... nem que seja ASCII hardcore  :P

Pronto, já te fiz o favor e sim senhor, essa explicação está muito boa. :)

Sempre a defender o seu orgulho lol

Se não o defender, quem defenderá? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, excelente, obrigado pela aula gratis :P

ainda não fiz nd pq entretanto arranjei outro metodo, muito lento. mas que deu pra ter uma ideia, e fazer um exemplo do que queria.

Desde ja obrigadissimo, vou deixar aqui o codigo se conseguir faze-lo, vou ter em atençao os radianos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora