/************************************/ /* 直線(ベクトル)の角度を求める */ /************************************/ import java.awt.*; public class mathvecs extends java.applet.Applet { Image screen; Graphics g_screen; Panel ppoint,pdegree; TextField tx,ty,ts; Label dg; int i,j,x,y; final double pie=3.1416; /* πの値 */ public void init(){ resize(288,320); setBackground(Color.green); /*アプレットの背景を緑にする*/ setFont(new Font("TimesRoman",Font.PLAIN,12)); screen=createImage(258,258); g_screen=screen.getGraphics(); ppoint=new Panel(); pdegree=new Panel(); this.setLayout((LayoutManager)null); add(ppoint); add(pdegree); ppoint.setBounds(8,272,152,48); pdegree.setBounds(160,272,116,48); ppoint.setLayout(new FlowLayout(FlowLayout.CENTER,4,4)); pdegree.setLayout(new FlowLayout(FlowLayout.CENTER,4,4)); dg=new Label("degree",Label.LEFT); tx=new TextField(4); ty=new TextField(4); ts=new TextField(4); tx.setEditable(false); /*テキスト編集不可*/ ty.setEditable(false); ts.setEditable(false); ppoint.add(tx); ppoint.add(ty); pdegree.add(ts); pdegree.add(dg); tx.setBackground(Color.white); ty.setBackground(Color.white); ts.setBackground(Color.white); dg.setBackground(Color.green); screenInit(); repaint(); } public void screenInit() { g_screen.setColor(Color.white); g_screen.fillRect(0,0,258,258); g_screen.setColor(Color.black); g_screen.drawRect(0,0,257,257); g_screen.drawLine(0,128,256,128); g_screen.drawLine(128,0,128,256); g_screen.drawOval(114,131,10,12); } public boolean mouseMove(Event evt,int mx,int my){ /*マウス移動*/ if (mx<16 ||mx>272 ||my<8 ||my>264) return false; x=mx-144; /*画面の座標をグラフの座標に変換*/ y=136-my; if (x==0 && y==0) /*原点(ゼロベクトル)なら計算不可*/ return false; screenInit(); g_screen.setColor(Color.blue); g_screen.drawLine(128,128,x+128,128-y); repaint(); tx.setText(String.valueOf(x)); ty.setText(String.valueOf(y)); ts.setText(String.valueOf(kakudo((double)x,(double)y))); return true; } public int kakudo(double x,double y) { /*ベクトルの角度を計算*/ double s; int deg; s=Math.acos(x/Math.sqrt(x*x+y*y)); /*角度θを求める*/ s=(s/pie)*180.0; /* ラジアンを度に変換 */ if (y<0) /* θ>πの時 */ s=360-s; deg=(int)Math.floor(s); if ((s-deg)>=0.5) /*小数点を四捨五入*/ deg++; return deg; /*角度θを返す*/ } public void paint(Graphics g){ g.drawImage(screen,15,7,this); } public void update(Graphics g){ paint(g); } }