This rotating rod program lets
you add any number of rods dynamically, each newly added rod will have its
center of rotation at the end-point of the previous rod.
/***************************************************************/
You may also like the Rotating rods program in javascript using canvas in HTML5. The following two links also provides illustrations for the same.
/***************************************************************/
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; class Rod { static LinkedList<Rod>lst=new LinkedList<Rod>(); static Dimension dim; Graphics g; double angle; double rpm,a,b,c,d,rodLength,delayTime; Color rodColor; Rod(){} Rod(double a,double b,double c,double d,double rodLenth,double rpm,String rodColor,Graphics g,Dimension dim) { this.dim=dim; this.g=g; this.rodLength=rodLength; this.a=a; this.b=b; this.c=c; this.d=d; this.rpm=rpm; this.delayTime=100; this.angle=6*rpm*Math.PI/1800; if(rodColor.equals("Black")) this.rodColor=Color.black; else if(rodColor.equals("Green")) this.rodColor=Color.green; else if(rodColor.equals("Yellow")) this.rodColor=Color.yellow; else if(rodColor.equals("Blue")) this.rodColor=Color.blue; else if(rodColor.equals("Red")) this.rodColor=Color.red; } public void drawRotatingRod()throws InterruptedException { while(true) { for(int i=0;i<lst.size();i++) { g.setColor(lst.get(i).rodColor); g.drawLine((int)lst.get(i).a,(int)lst.get(i).b,(int)lst.get(i).c,(int)lst.get(i).d); } Thread.sleep((long)delayTime); g.setColor(Color.white); g.fillRect(0,0,dim.width,dim.height); for(int i=0;i<lst.size();i++) for(int j=i;j<lst.size();j++) rotate(lst.get(i).a,lst.get(i).b,lst.get(j),lst.get(i).angle); } } public static void rotate(double x,double y,Rod r,double angle) { Rod rod=new Rod(); rod.a=(r.a-x)*Math.cos(angle)-(r.b-y)*Math.sin(angle)+x; rod.b=(r.a-x)*Math.sin(angle)+(r.b-y)*Math.cos(angle)+y; rod.c=(r.c-x)*Math.cos(angle)-(r.d-y)*Math.sin(angle)+x; rod.d=(r.c-x)*Math.sin(angle)+(r.d-y)*Math.cos(angle)+y; r.a=rod.a; r.b=rod.b; r.c=rod.c; r.d=rod.d; } } class Main extends WindowAdapter implements ActionListener { int submitButtonCounter=0; Frame f1=new Frame(); Frame f2=new Frame(); Dimension d; Button bSubmit,bClear; Choice ch; TextField tRodLength,trpm; Label lRodLength,lrpm,lColor; MenuItem mExit,mClear,mAdd; public static void main(String args[]) { Main m=new Main(); } Main() { /*****/ /* to maximize the window */ f1.setState(Frame.NORMAL); Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension dimension = toolkit.getScreenSize(); f1.setSize(dimension); /*******/ f1.setLocation(0,0); f1.setResizable(false); d=f1.getSize(); MenuBar mb=new MenuBar(); Menu menu=new Menu("Menu"); mClear=new MenuItem("Clear"); mExit=new MenuItem("Exit"); mAdd=new MenuItem("Add Rod"); f1.setMenuBar(mb); mb.add(menu); menu.add(mAdd); menu.add(mClear); menu.add(mExit); mClear.addActionListener(this); mAdd.addActionListener(this); mExit.addActionListener(this); f1.addWindowListener(this); f1.setVisible(true); /******************************/ f2.setSize(400,300); f2.setLocation(100,100); tRodLength=new TextField(); tRodLength.setFont(new Font("arial",Font.PLAIN,20)); trpm=new TextField(); trpm.setFont(new Font("arial",Font.PLAIN,20)); lRodLength=new Label("Length of rod"); lRodLength.setFont(new Font("arial",Font.PLAIN,20)); lrpm=new Label("Rotating speed in rpm"); lrpm.setFont(new Font("arial",Font.PLAIN,20)); lColor=new Label("Select a Color"); lColor.setFont(new Font("arial",Font.PLAIN,20)); ch=new Choice(); ch.add("Red"); ch.add("Green"); ch.add("Black"); ch.add("Blue"); ch.add("Yellow"); bSubmit=new Button("Submit"); bClear=new Button("Clear"); Panel p=new Panel(new GridLayout(5,1,20,20)); Panel p1=new Panel(new BorderLayout(85,10)); p1.add(lRodLength,BorderLayout.WEST); p1.add(tRodLength,BorderLayout.CENTER); Panel p2=new Panel(new BorderLayout(10,10)); p2.add(lrpm,BorderLayout.WEST); p2.add(trpm,BorderLayout.CENTER); Panel p3=new Panel(new BorderLayout(78,10)); p3.add(lColor,BorderLayout.WEST); p3.add(ch,BorderLayout.CENTER); Panel p4=new Panel(new GridLayout(1,5,10,10)); p4.add(new Label("")); p4.add(bSubmit); p4.add(new Label("")); p4.add(bClear); p4.add(new Label("")); p.add(p1); p.add(p2); p.add(p3); p.add(new Label("")); p.add(p4); f2.add(p); bSubmit.addActionListener(this); bClear.addActionListener(this); f2.addWindowListener(this); } public void actionPerformed(ActionEvent ae) { if(ae.getSource()==bClear) { tRodLength.setText(" "); trpm.setText(" "); } else if(ae.getSource()==mExit) { System.exit(0); } else if(ae.getSource()==mAdd) { f1.setEnabled(false); f2.setVisible(true); tRodLength.setText(""); trpm.setText(""); } else if(ae.getSource()==bSubmit) { try { f1.repaint(); submitButtonCounter++; Graphics g=f1.getGraphics(); d=f1.getSize(); Rod r; if(submitButtonCounter==1) { r=new Rod( d.width/2.0, d.height/2.0, Double.parseDouble(tRodLength.getText())+d.width/2.0, d.height/2, Double.parseDouble(tRodLength.getText()), Double.parseDouble(trpm.getText()), ch.getSelectedItem(),g,d); } else { r=new Rod (Rod.lst.get(submitButtonCounter-2).c, Rod.lst.get(submitButtonCounter-2).d, Double.parseDouble(tRodLength.getText())+Rod.lst.get(submitButtonCounter-2).c, Rod.lst.get(submitButtonCounter-2).d, Double.parseDouble(tRodLength.getText()), Double.parseDouble(trpm.getText()), ch.getSelectedItem(),g,d); } Rod.lst.add(r); f2.dispose(); f1.setEnabled(true); f1.toFront(); MyThread t=new MyThread(r); } catch(Exception e) { submitButtonCounter--; JOptionPane.showMessageDialog(f2,"Enter a valid Integer"); } } else if(ae.getSource()==mClear) { Graphics g=f1.getGraphics(); for(int i=0;i<MyThread.threadList.size();i++) MyThread.threadList.get(i).stop(); g.setColor(Color.white); g.fillRect(0,0,d.width,d.height); Rod.lst=new LinkedList<Rod>(); submitButtonCounter=0; } } public void windowClosing(WindowEvent e) { if(e.getSource()==f1) System.exit(0); else if(e.getSource()==f2) { f2.dispose(); f1.setEnabled(true); f1.toFront(); } } } class MyThread extends Thread { Thread th; Rod r; static LinkedList<Thread>threadList=new LinkedList<Thread>(); MyThread(Rod r) { this.r=r; th=new Thread(this); threadList.add(th); th.start(); } public void run() { try { r.drawRotatingRod(); } catch(InterruptedException e){} } }
You may also like the Rotating rods program in javascript using canvas in HTML5. The following two links also provides illustrations for the same.
- SpiroGraph1
- SpiroGraph2 (with 4 simultaneous rotating rods)
No comments:
Post a Comment