(cache) javaの円グラフがうまくいきません。 | OKWave

javaの円グラフがうまくいきません。

FAQ(よくある質問)

法人向けサービス

解決済みの質問

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

連想キーワード:

QNo.6720661

困ってます

質問者が選んだベストアンサー

> 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

ANo.3

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(2件中 1~2件目)

ANo.2

ANo.1で「i=0のときにpa[i-1]を参照したら例外が発生します。」と書いたのは的外れだったので訂正します。i=0のときにはs=s+360*pa[i-1]/sum;は実行されません。
ただしiが1以上の時の開始角指定が正しくないので、for (u = 0; u < i; u++) { … }のループは消して、代わりにs=s+360*pa[i]/sum;をfillArc()の次の行に書くべきでしょう。

投稿日時 - 2011-05-07 19:12:01

ANo.1

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

PR

プロフィール画像選択機能追加![ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら

【教えてプロポーズ!】

結婚・プロポーズのQ&A特集はこちら