Bem, tenho uma dúvida: Como eu faço para que sejam desenhadas um certo número de retas partindo do centro do círculo?
Abaixo um código que eu gostaria de fazer isso. Este código desenha 8 círculos concentricos. Agora eu preciso desenhar a partir do centro, retas como se fosse uma tela de radar.
Seria como seu estivesse fatiando os círculos a partir do centro.
Quantos segmentos de reta você quer desenhar? Em que ângulos?
J
joaogustavo2010
entanglement:
Sabe um pouco de trigonometria? Se souber, ajuda.
Quantos segmentos de reta você quer desenhar? Em que ângulos?
O numero de retas inicialmente, pode ser 8, depois vai ser variavel, como se fossem divididas em pizza, com porcoes de tamanho iguais. Tais retas devem comecar no centro do circulo e chegar ate no final do grafico. Se puderem me ajudar, ficaria muito grato. Conheco e tenho mais experiencia com outras parte do java, agora que estou precisando trabalhar com graficos.
Abaixo a forma pretendida:
Depois que eu conseguir criar esta forma, preciso pintar alguns pedacinhos individualmente, assim como no imagem. Mas por hora, preciso apenas de uma maneira com o codigo acima de criar aquela grade. Grato.
Amigo, esse é um grafico de níveis. Existe alguma funcao que me posicione no centro deste circulo? Ele irá funcionar assim: Cada fatia corresponde a um setor, e cada pedaco desta fatia representa um nivel, ou seja, neste caso como tenho 8 circulos, quando for fatiado em partes iguais, cada fatia devera possui 8 níveis.
valeu.
E
entanglement
Infelizmente o meu proxy não está me deixando visualizar sua imagem. Você quer algo parecido com isto?
J
joaogustavo2010
[quote=entanglement]Infelizmente o meu proxy não está me deixando visualizar sua imagem. Você quer algo parecido com isto?
Amigo, postei em outro image hosting, v c agora agora da pra vc ver a imagem, é um trabalho pra facul, eh um grafico diferente dos demais.
Você poderia ter continuado a complementar as informações por lá, pois eu ainda receberia um e-mail.
Você chegou a ler os artigos que indiquei?
No terceiro link, havia a explicação de como achar um ponto que está na superficie de uma circunferência.
J
joaogustavo2010
entanglement:
Ah, beleza, isso não é tão difícil de desenhar. Vou ver se monto um exemplo depois do almoço.
Valeu amigo, estou aguardando sua ajuda. Acho que o mais complicado mesmo seria tipo: Se uma fatia tem 5 niveis, pintar 5 pedacinhos. se outra fatia tem nivel 2, pintar 2 pedacinhos.
Fiquei meio que sem tempo pra terminar este grafico, pois estou com atividades em PVM, Corba e simulacao. Caso conseguir me ajudar com um exemplo ficaria muito grato!
J
joaogustavo2010
ViniGodoy:
João, por que você duplicou o tópico e criou outro usuário?
Você poderia ter continuado a complementar as informações por lá, pois eu ainda receberia um e-mail.
Você chegou a ler os artigos que indiquei?
No terceiro link, havia a explicação de como achar um ponto que está na superficie de uma circunferência.
Bom dia, nao estava conseguindo receber o email de alteracao de senha da outra conta, caso voce puder apagar o outro topico e manter este eu agradeceria muito. Acho que estava no tema errado aquele outro tambem ne? To apertadaço com o tempo aqui, trab de sistemas distribuidos, simulacao de redes e tava precisando de ajuda!!
Aliás, voce está de parabéns com os seus artigos.
V
ViniGodoy
Ok, já que a trigonometria está difícil, vou te passar a fórmula.
Onde x1 e y1 são as coordenadas do ponto no centro da circunferência, e x2 e y2 são as coordenadas do ponto resultante, size é o tamanho do segmento de reta e angle é o ângulo que deve ser traçado em relação ao eixo x. Lembrando que o ângulo é em radianos e vai de 0 até 2*PI.
Agora é só fazer um for.
Se você usar vetores, fica mais fácil ainda. Se v1 for o vetor que marca o centro do circulo, v2 é definido por:
E
entanglement
packageguj;importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.RenderingHints;importjava.awt.geom.Arc2D;importjava.awt.geom.Ellipse2D;importjava.awt.geom.Line2D;importjava.util.ArrayList;importjava.util.List;importjavax.swing.JPanel;publicclassGraficoNivelextendsJPanel{publicstaticclassValor{privatedoublevalor;privateStringlegenda;publicValor(doublevalor,Stringlegenda){this.valor=valor;this.legenda=legenda;}publicdoublegetValor(){returnvalor;}publicvoidsetValor(doublevalor){this.valor=valor;}publicStringgetLegenda(){returnlegenda;}publicvoidsetLegenda(Stringlegenda){this.legenda=legenda;}};publicGraficoNivel(){super();}privateList<Valor>valores=newArrayList<Valor>();publicvoidadd(Valorvalor){valores.add(valor);System.out.println(valores);}publicvoidclear(){valores.clear();}publicvoidsetDivisoes(intnDivisoes){this.nDivisoes=nDivisoes;}privatevoidnormalize(Graphics2Dg2d,Dimensiondim){g2d.translate(dim.width/2,dim.height/2);g2d.scale((dim.width-2)/2,-(dim.height-2)/2);}@OverrideprotectedvoidpaintComponent(Graphicsg){Graphics2Dg2d=(Graphics2D)g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);// Devemos a princípio determinar as dimensões, de forma que possamos normalizar// para um sistema de coordenadas com -1 <= x <= +1 e -1 <= y <= +1, e com o // eixo dos x apontando para cima, não para baixo.normalize(g2d,getSize());g2d.setStroke(newBasicStroke(0.01f));// Vamos desenhar as fatias, de acordo om seus respectivos raiosfor(inti=1;i<=valores.size();++i){doubleradius=valores.get(i-1).getValor();doubleangle=360/valores.size();g2d.setPaint(newColor((int)(255*i/valores.size()),(int)(255*i/valores.size()),(int)(255*i/valores.size())));System.out.println(radius);Arc2D.Doubled=newArc2D.Double(-radius,-radius,2*radius,2*radius,270-(int)(angle*(i-1)),(int)angle,Arc2D.PIE);g2d.fill(d);}g2d.setPaint(Color.BLACK);// Vamos desenhar agora os raios (um para cada Valor)System.out.println(valores.size());for(inti=0;i<valores.size();++i){doubletheta=2*Math.PI*i/valores.size();g2d.draw(newLine2D.Double(0,0,Math.sin(theta),Math.cos(theta)));}// Agora, vamos desenhar a quantidade de subdivisõesfor(inti=1;i<=nDivisoes;++i){doubleradius=i*1.0/nDivisoes;Ellipse2D.Doubled=newEllipse2D.Double(-radius,-radius,2*radius,2*radius);g2d.draw(d);}g2d.dispose();}privateintnDivisoes=3;}
packageguj;importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.RenderingHints;importjava.awt.geom.Arc2D;importjava.awt.geom.Ellipse2D;importjava.awt.geom.Line2D;importjava.util.ArrayList;importjava.util.List;importjavax.swing.JPanel;publicclassGraficoNivelextendsJPanel{publicstaticclassValor{privatedoublevalor;privateStringlegenda;publicValor(doublevalor,Stringlegenda){this.valor=valor;this.legenda=legenda;}publicdoublegetValor(){returnvalor;}publicvoidsetValor(doublevalor){this.valor=valor;}publicStringgetLegenda(){returnlegenda;}publicvoidsetLegenda(Stringlegenda){this.legenda=legenda;}};publicGraficoNivel(){super();}privateList<Valor>valores=newArrayList<Valor>();publicvoidadd(Valorvalor){valores.add(valor);System.out.println(valores);}publicvoidclear(){valores.clear();}publicvoidsetDivisoes(intnDivisoes){this.nDivisoes=nDivisoes;}privatevoidnormalize(Graphics2Dg2d,Dimensiondim){g2d.translate(dim.width/2,dim.height/2);g2d.scale((dim.width-2)/2,-(dim.height-2)/2);}@OverrideprotectedvoidpaintComponent(Graphicsg){Graphics2Dg2d=(Graphics2D)g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);// Devemos a princípio determinar as dimensões, de forma que possamos normalizar// para um sistema de coordenadas com -1 <= x <= +1 e -1 <= y <= +1, e com o // eixo dos x apontando para cima, não para baixo.normalize(g2d,getSize());g2d.setStroke(newBasicStroke(0.01f));// Vamos desenhar as fatias, de acordo om seus respectivos raiosfor(inti=1;i<=valores.size();++i){doubleradius=valores.get(i-1).getValor();doubleangle=360/valores.size();g2d.setPaint(newColor((int)(255*i/valores.size()),(int)(255*i/valores.size()),(int)(255*i/valores.size())));System.out.println(radius);Arc2D.Doubled=newArc2D.Double(-radius,-radius,2*radius,2*radius,270-(int)(angle*(i-1)),(int)angle,Arc2D.PIE);g2d.fill(d);}g2d.setPaint(Color.BLACK);// Vamos desenhar agora os raios (um para cada Valor)System.out.println(valores.size());for(inti=0;i<valores.size();++i){doubletheta=2*Math.PI*i/valores.size();g2d.draw(newLine2D.Double(0,0,Math.sin(theta),Math.cos(theta)));}// Agora, vamos desenhar a quantidade de subdivisõesfor(inti=1;i<=nDivisoes;++i){doubleradius=i*1.0/nDivisoes;Ellipse2D.Doubled=newEllipse2D.Double(-radius,-radius,2*radius,2*radius);g2d.draw(d);}g2d.dispose();}privateintnDivisoes=3;}
Muito obrigado a todos, principalmente ao amigo entanglement!!
J
joaogustavo2010
Tentei colocar legenda em cada fatia mas ta saindo esquisito e as vezes nem sai. Alguma ideia de como posso colocar do lado de fora de cada fatia? Ou qual seriam as medidas que eu deveria considerar?
Abraco.
E
entanglement
Acho que você não vai mais poder evitar fazer algumas contas, não? Você talvez tenha de achar um ponto no meio de cada fatia, e a partir desse ponto, posicionar sua legenda.
J
joaogustavo2010
Voce poderia me dar um exemplo em uma fatia deste codigo por favor ? Depois contribuo com algum bom artigo aqui no GUJ. Estou com um projeto de software para a faculdade que algumas tarefas foram divididas entre os grupos. So que me foram delegadas outras tarefas que ainda nao foram concluidas. Obrigado.
E
entanglement
Vou dar uma sugestão.
É que se você pensar bem, o posicionamento das legendas não é tão simples quanto parece; poderíamos ter de reduzir o desenho, e ficar puxando retas a partir do centro de cada fatia, o que é um pouquinho chato de fazer.
Eu já vi muitos gráficos em que a legenda era por cores, não diretamente sobre o desenho.
Então você poderia escolher umas cores bem diferentes (em vez dos diversos tons de cinza que usei) e então pôr a legenda do lado do desenho, talvez usando uma série de JLabels em que as cores do background fossem as cores do desenho.
J
joaogustavo2010
entanglement:
Vou dar uma sugestão.
É que se você pensar bem, o posicionamento das legendas não é tão simples quanto parece; poderíamos ter de reduzir o desenho, e ficar puxando retas a partir do centro de cada fatia, o que é um pouquinho chato de fazer.
Eu já vi muitos gráficos em que a legenda era por cores, não diretamente sobre o desenho.
Então você poderia escolher umas cores bem diferentes (em vez dos diversos tons de cinza que usei) e então pôr a legenda do lado do desenho, talvez usando uma série de JLabels em que as cores do background fossem as cores do desenho.
Entao rapaz, eu comecei a fazer isso, coloquei um ArrayList para pegar as cores de todas as fatias coloridas. Mas nao estou conseguindo desenhar do lado do grafico. Pode me dar uma forca? E vc acha que o BorderLayout seria o melhor para este caso?
Obrigado pela rapida resposta.
E
entanglement
Eu acho que não seria necessário desenhar do lado do gráfico (até porque você precisaria de mexer um pouco na parte de conversão de coordenadas. Você deve ter visto que, conforme o gráfico é redimensionado, o círculo fica na verdade como uma elipse e ocupa todo o gráfico).
Eu acho que você pode enquadrar esse gráfico em um JFrame ou JDialog (por exemplo), e pôr as legendas em JLabels ao lado do gráfico. É mais fácil.
J
joaogustavo2010
entanglement:
Eu acho que não seria necessário desenhar do lado do gráfico (até porque você precisaria de mexer um pouco na parte de conversão de coordenadas. Você deve ter visto que, conforme o gráfico é redimensionado, o círculo fica na verdade como uma elipse e ocupa todo o gráfico).
Eu acho que você pode enquadrar esse gráfico em um JFrame ou JDialog (por exemplo), e pôr as legendas em JLabels ao lado do gráfico. É mais fácil.
Ele esta dentro de um Applet, o Jframe do grafico esta de dentro do ContentPane do Applet. Instanciei outro JPanel e estou usando o BorderLayout so que ele apertou muito para o lado. Tem alguma sugestao de LayoutManager que nao vai sufocar meu outro frame para o canto?