javaの円グラフがうまくいきません。
import java.applet.Applet;
import java.awt.*;
public class graph extends Applet{
public void paint(Graphics g){
int pa[] = new int[5];
int i,count;
pa[0]=-72;
pa[1]=-72;
pa[2]=-72;
pa[3]=-72;
pa[4]=-72;
count=5;
int k=0;
if(pa[k]<0){
pa[k]=0;
}
int t,sum=0;
for(t=0;t<count;t++){
sum=sum+pa[t];
}
int u,s=0;
for(i=0;i<5;i++){
for(u=0;u<i;u++){
s=s+360*pa[i-1]/sum; //
}
g.setColor(new Color(200,50,200));
g.fillArc(100, 100, 300, 300, 90+s,pa[i]/sum*360);
}
}
}
実行しても真っ白のままなにも描かれていません。
count=1にしてpa[0]の部分だけを描こうとしても無理でした。
直接-72と入れるとちゃんと描かれていました。
どうしてでしょうか?
投稿日時 - 2011-05-07 17:49:39
> pa[i]の割り算のところは、よくわかりません。
pa[i]=-72, sum=-360だとして、pa[i]/sum*360の計算を順番に考えてみましょう。
先に計算される部分にカッコをつけると(-72/-360)*360となりますが、カッコの中の割り算はこの場合整数演算なので結果は0です。0.2にはなりません。したがって、0*360=0となります。
> インターネットで(double)をつけるといいらしいのですが、つける場所がイマイチわかりません。
上の式でpa[i]とsumのどちらかをdoubleにキャストしてやれば、割り算の結果が0ではなく0.2になります。
整数 / 整数 → 整数
浮動小数点数 / 整数 → 浮動小数点数
整数 / 浮動小数点数 → 浮動小数点数
浮動小数点数 / 浮動小数点数 → 浮動小数点数
ただし、fillArc()は第6引数に浮動小数点数を受け付けないので、360を掛けた後にもう一度intにキャストする必要があります。
分解して書いてみます。yがfillArc()に渡す角度です。
double x = (double)pa[i]/sum;
int y = (int)(x*360);
投稿日時 - 2011-05-07 20:28:13
お礼
ありがとうございます。なんとか完成させることができますた。
pa[-1]の場合もif文で何とかできました。
本当に助かりました。
投稿日時 - 2011-05-07 21:32:10
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(2件中 1~2件目)
int k=0;
if(pa[k]<0){
pa[k]=0;
}
の部分の意図は何ですか?
kは変化せず、またpa[0]=-72;で代入した値が0に変えられてしまいます。pa[0]の値を0にしたいのなら最初からpa[0]=0;とすればいいのでは?
for(i=0;i<5;i++){
for(u=0;u<i;u++){
s=s+360*pa[i-1]/sum; //
}
i=0のときにpa[i-1]を参照したら例外が発生します。
g.fillArc(100, 100, 300, 300, 90+s,pa[i]/sum*360);
pa[i]の型はintなので、先にsumで割ると0になってしまいます。
投稿日時 - 2011-05-07 18:12:50
返答ありがとうございます。
int k=0;
if(pa[k]<0){
pa[k]=0;
}
i=0のときの例外のために書いたと思われますが、改めて見るとおかしいですね(笑
pa[-1]の例外は普通にpa[-1]=0で大丈夫ですか?
pa[i]の割り算のところは、よくわかりません。
割り算したときに、あまりは切り捨てられることといっしょですか?
インターネットで(double)をつけるといいらしいのですが、つける場所がイマイチわかりません。
投稿日時 - 2011-05-07 19:11:45