ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの数学関数を用いて,自分の名前や所属をできるだけ円状に表示するフレームを作る

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Math.〜を使って名前や所属をできるだけ円状に表示するようにしたいのですが、どこで Math. を使ってどうすれば円状に表示されるのかわかりません。
できるだけ下に手を加えるぐらいでシンプルにお願いします。

import java.awt.*;

class CircleFrame extends Frame
{

 public void paint(Graphics g)
 {
  g.drawString( "伊園摩知伊園犯罪研究所" 30, 50);
 }

 public static void main( String [] args )
 {
  CircleFrame circleFrame = new CircleFrame();

  circleFrame.setSize( 500, 500);
  circleFrame.setTitle( "名前所属を円状に配列" );
  circleFrame.setVisible( true );
 }
}

コメント(6)

研究所" の後に「,」が抜けてました。
フレーム内に一文字ずつ円状に名前所属が表示されるようにしたいです。
あまりいい例ではありませんが、
↓こんな感じで。

    伊園
   犯  摩
  園    知
 伊      伊
知        園
 摩      犯
  園    罪
   伊  研
    所究
ちょっと今は時間ないので案だけ。

三角関数で円グラフ書くとかありましたね。
三平方の定理で良かった。
とりあえず、座標。合ってます?

double r = 10; // 半径。
for(double x=-r;x<=r;x+=1){
// x^2+y^2=r^2
double y =Math.sqrt(Math.pow(r,2)-Math.pow(x,2));
System.out.println("("+x+","+y+"),("+x+","+-y+")");
}

< stdout
(-10.0,0.0),(-10.0,-0.0)
(-9.0,4.358898943540674),(-9.0,-4.358898943540674)
(-8.0,6.0),(-8.0,-6.0)
(-7.0,7.14142842854285),(-7.0,-7.14142842854285)
(-6.0,8.0),(-6.0,-8.0)
(-5.0,8.660254037844387),(-5.0,-8.660254037844387)
(-4.0,9.16515138991168),(-4.0,-9.16515138991168)
(-3.0,9.539392014169456),(-3.0,-9.539392014169456)
(-2.0,9.797958971132712),(-2.0,-9.797958971132712)
(-1.0,9.9498743710662),(-1.0,-9.9498743710662)
(0.0,10.0),(0.0,-10.0)
(1.0,9.9498743710662),(1.0,-9.9498743710662)
(2.0,9.797958971132712),(2.0,-9.797958971132712)
(3.0,9.539392014169456),(3.0,-9.539392014169456)
(4.0,9.16515138991168),(4.0,-9.16515138991168)
(5.0,8.660254037844387),(5.0,-8.660254037844387)
(6.0,8.0),(6.0,-8.0)
(7.0,7.14142842854285),(7.0,-7.14142842854285)
(8.0,6.0),(8.0,-6.0)
(9.0,4.358898943540674),(9.0,-4.358898943540674)
(10.0,0.0),(10.0,-0.0)
等間隔にならなかった。
ラジアンを使った方がいいんですかね。

public void paint(Graphics g){
int offset=100;
double r = 100;
double step = r*2/(message.length()+1);
int index=0;
for(double x=-r;x<=r;x+=step){
// x^2+y^2=r^2
String c;
double y = Math.sqrt(Math.pow(r,2)-Math.pow(x,2));

c = message.substring(index,index+1);
g.drawString(c,(int)(r+x+offset),(int)(r+y+offset));

int rindex = message.length() - index;
c = message.substring(rindex-1,rindex);
g.drawString(c,(int)(r+x+offset),(int)(r-y+offset));

System.out.println(c+"("+(int)(x)+","+(int)(y)+")");

index++;
if(message.length()<=index){
break;
}
}

}
数学の三角関数を使ってみました。
倍率(power)を変更すれば楕円でも大丈夫です。
finalで定数としてを宣言していますけど、変数でも問題ありません。

三角関数のスタート位置の関係上、右から文字が始まります。

final int Xpower = 100;
final int Ypower = 100;
final int offset = 200; // 表示範囲へ平行移動させるためのオフセット値
public void paint(Graphics g) {
double step = 2.0 / (message.length());
int index = 0;

for(double d = 0.0; d <= 2.0; d += step, index++;){
/* 座標
* x = a * cos(rad)
* y = b * sin(rad)
*/
String c;
int x = (int) ( Xpower * Math.cos(d * Math.PI) + offset );
int y = (int) ( Ypower * Math.sin(d * Math.PI) + offset );

c = message.substring(index, index + 1);
g.drawString(c, x, y);

System.out.println(c+"("+(int)(x)+","+(int)(y)+")");
}
}
解決しました。こんな感じです。

import java.awt.*;

class CircleFrame extends Frame
{
public void paint(Graphics g)
{

String name [] = {"伊","園","摩","知","伊","園","犯","罪","研","究","所"};
int num=11;

for (int i = 0; i < num; ++i)
{

int x0=(int)(200 + 100 * Math.sin(2*Math.PI/num *i));
int y0=(int)(200 + 100 * Math.cos(2*Math.PI/num *i));
g.drawString( name[i], x0,y0);
}
}

public static void main( String [] args )
{
CircleFrame circleFrame = new CircleFrame();

circleFrame.setSize( 500, 500);
circleFrame.setTitle( "名前所属を円状に配列" );
circleFrame.setVisible( true );
}
}

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。