- ベストアンサー
Javaの円グラフが描かれない理由
- Javaの円グラフが描かれない理由について説明します。
- プログラムの中で指定されているパラメーターの値が原因で円グラフが描かれない場合があります。
- 具体的には、paの各要素が-72で初期化されているため、描画されない問題が発生しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 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);
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
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()の次の行に書くべきでしょう。
- salsberry
- ベストアンサー率69% (495/711)
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になってしまいます。
お礼
返答ありがとうございます。 int k=0; if(pa[k]<0){ pa[k]=0; } i=0のときの例外のために書いたと思われますが、改めて見るとおかしいですね(笑 pa[-1]の例外は普通にpa[-1]=0で大丈夫ですか? pa[i]の割り算のところは、よくわかりません。 割り算したときに、あまりは切り捨てられることといっしょですか? インターネットで(double)をつけるといいらしいのですが、つける場所がイマイチわかりません。
お礼
ありがとうございます。なんとか完成させることができますた。 pa[-1]の場合もif文で何とかできました。 本当に助かりました。