Jump to content

Recommended Posts

Posted

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 😛

obrigado desde já

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Posted

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.

Posted

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.

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Posted

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?

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Posted

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).

http://img529.imageshack.us/img529/6733/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.

Não respondo a dúvidas por mensagem.

Posted

@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 😛 ).

Posted

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 😛 ).

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.

Não respondo a dúvidas por mensagem.

Posted

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 😛

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

Posted

Tavas à espera que eu fosse decifrar toda essa equação em ASCII? 😛 LOL 🙂

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

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

Sempre a defender o seu orgulho lol

Não respondo a dúvidas por mensagem.

Posted

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

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á? 😛

Posted

Bem, excelente, obrigado pela aula gratis 😛

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.

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

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.