Wykres kołowy

0

Witam,

Mam problem. Muszę zrobić applet w którym wpisujemy w 3 różne pola tekstowe dowolne wartośći.
Po naciśnięciu guzika program rysuje wykres kołowy i dzieli okrąg na 3 kawałki(czerwony,zielony,niebieski).
Wielkośći kawałków mają być zależne od wielkości jakie wpisaliśmy w pola przykład :
pole1(red) - 50
pole2(green) - 15
pole3(blue) - 35
a więc 50% koła będzie miało kolor czerwony i analogicznie z resztą kolorów.
Wiem jak zrobić to na kątach ale nie wiem jak na procentach.
Próbuje od kilku godzin, proszę o pomoc.
Mój kod:(problem jest w metodzie actionPerformed)

 import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Grafika extends Applet implements ActionListener{
    TextField r,g,b;
    Button bDraw;
    int size1,size2,size3,calosc;
    int rsize,gsize,bsize;
     public void init(){
        r = new TextField(10);
        g = new TextField(10);
        b = new TextField(10);
        add(r);
        add(g);
        add(b);
        bDraw = new Button("D");
        add(bDraw);
        bDraw.addActionListener(this);
    }
    public void paint(Graphics g1){
        setBackground(new Color(60,60,60));
        
        r.setBounds(100,40,70,30);
        g.setBounds(180,40,70,30);
        b.setBounds(260,40,70,30);
        
        r.setBackground(Color.RED);
        g.setBackground(Color.GREEN);
        b.setBackground(Color.BLUE);
        
        r.setForeground(Color.WHITE);
        g.setForeground(Color.BLACK);
        b.setForeground(Color.WHITE);
        
        bDraw.setBounds(320,90,30,30);
        // tu zaczyna sie problem...
        g1.setColor(Color.RED);
        g1.fillArc(170,200,200,200,0,rsize);
        g1.setColor(Color.GREEN);
        g1.fillArc(170,200,200,200,rsize,gsize);
        g1.setColor(Color.BLUE);
        g1.fillArc(170,200,200,200,rsize+gsize,calosc);
    }
    public void actionPerformed(java.awt.event.ActionEvent zdarzenie){
       
        size1=Integer.parseInt(r.getText());
        size2=Integer.parseInt(g.getText());
        size3=Integer.parseInt(b.getText());
        
        calosc = size1 + size2 + size3;
        
        rsize= (size1*100)/calosc;
        gsize= (size2*100)/calosc;
        bsize= (size3*100)/calosc;
        
        repaint();
    }
}
0

Błąd masz w liczeniu składu procentowego kolorów:

 rsize= (size1*100)/calosc;
 gsize= (size2*100)/calosc;
 bsize= (size3*100)/calosc;

powinno być

 (size * 360) / 100

dodatkowo

g1.fillArc(170,200,200,200,rsize+gsize,calosc); na g1.fillArc(170, 200, 200, 200, 0, -bsize);
0

Zrobiłem tak jak Pan napisał ale program dalej nie działa poprawnie,
przykładowo dla :
r: 53
g:35
b:53
wykres jest wypełniony tylko kolorem czerwonym i niebieskim

 import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Grafika extends Applet implements ActionListener{
    TextField r,g,b;
    Button bDraw;
    int size1,size2,size3,calosc;
    int rsize,gsize,bsize;
     public void init(){
        r = new TextField(10);
        g = new TextField(10);
        b = new TextField(10);
        add(r);
        add(g);
        add(b);
        bDraw = new Button("D");
        add(bDraw);
        bDraw.addActionListener(this);
    }
    public void paint(Graphics g1){
        setBackground(new Color(60,60,60));
        
        r.setBounds(100,40,70,30);
        g.setBounds(180,40,70,30);
        b.setBounds(260,40,70,30);
        
        r.setBackground(Color.RED);
        g.setBackground(Color.GREEN);
        b.setBackground(Color.BLUE);
        
        r.setForeground(Color.WHITE);
        g.setForeground(Color.BLACK);
        b.setForeground(Color.WHITE);
        
        bDraw.setBounds(320,90,30,30);
        // tu zaczyna sie problem...
        g1.setColor(Color.RED);
        g1.fillArc(170,200,200,200,0,rsize);
        g1.setColor(Color.GREEN);
        g1.fillArc(170,200,200,200,rsize,gsize);
        g1.setColor(Color.BLUE);
        g1.fillArc(170,200,200,200,0,-bsize);
    }
    public void actionPerformed(java.awt.event.ActionEvent zdarzenie){
       
        size1=Integer.parseInt(r.getText());
        size2=Integer.parseInt(g.getText());
        size3=Integer.parseInt(b.getText());
        
        calosc = size1 + size2 + size3;
        
        rsize= (size1*360)/100;
        gsize= (size2*360)/100;
        bsize= (size3*360)/100;
        
        repaint();
    }
}
0
RumCiur napisał(a):

Zrobiłem tak jak Pan napisał ale program dalej nie działa poprawnie,
przykładowo dla :
r: 53
g:35
b:53
wykres jest wypełniony tylko kolorem czerwonym i niebieskim


hmm może dlatego że to jest 141%??
0

Ponieważ max to 100%, a suma 53% + 53% + 35% > 100% więc "nadmalujesz" dane na wykresie kołowym. Trzeba dodać jakąś obsługę przekroczenia zakresu.

0

I właśnie w tej sprawie otworzyłem ten wątek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1