/** * cicloide * * @author (sergio savoldelli) * @version ( version number 3 -2011- ) */ import java.awt.Stroke; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import javax.swing.border.*; import java.awt.image.*; import java.awt.geom.*; import static java.lang.Math.*; public class cicloide extends JApplet implements MouseListener, MouseMotionListener { public double xx,yy,k0,a,aa,diametro,xe2,ye2,xz,yz,z,cerchi,lll,qq,xe,ye,bastx,basty; public int ncerchi,raggio, mov1,mov2,mov3,mov4,q,n,ci,rallenta=15,q2,q3, c; public int elimina = 2; public double pi=3.14159265; public double pi2 = pi*2; public double scelta = 1; public double di = 1; Button diametrob = new Button("CICLOIDE accorciata"); Button cicloide = new Button(" CICLOIDE "); Button cicloideri = new Button("CICLOIDE allungata"); Button rall = new Button("Rallenta"); Panel controlPanel, optionPanelColor, optionPanel0, optionPanel1, optionPanel2; Label titleLabel; Font font; public void init() { setLayout(new BorderLayout()); controlPanel = new Panel(); controlPanel.setBackground(Color.black); controlPanel.setLayout(new GridLayout(13,1)); add("East", controlPanel); titleLabel = new Label("CICLOIDE ", 1); font = new Font("Helvetica", Font.BOLD, 17); titleLabel.setFont(font); titleLabel.setBackground(Color.black); titleLabel.setForeground(Color.red); controlPanel.add(titleLabel); controlPanel.add(new Label(" ")); addMouseListener(this); addMouseMotionListener(this); controlPanel.add(cicloide); controlPanel.add(cicloideri); controlPanel.add(diametrob); controlPanel.add(rall); cicloide.addMouseListener(this); cicloideri.addMouseListener(this); diametrob.addMouseListener(this); rall.addMouseListener(this); setSize(750, 290); setBackground (Color.black); } //////////////////////////////////////////////// public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setColor(new Color(0,0,0)); g2.fillRect(1,1, 650, 290); BufferedImage bufimage; BufferedImage co; Graphics2D bufimagegraf,bufimagegrafb ; Graphics2D cog; co = new BufferedImage(650,290,BufferedImage.TYPE_4BYTE_ABGR); cog = co.createGraphics(); cog.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); cog.setColor(new Color(0,255,250));//linea verde cog.setStroke(new BasicStroke(1.2f)); bufimage = new BufferedImage(650, 290, BufferedImage.TYPE_4BYTE_ABGR); bufimagegraf= bufimage.createGraphics(); bufimagegraf.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); bufimagegraf.setStroke(new BasicStroke(1.2f)); bufimagegraf.setColor(new Color(0,255,0)); bufimagegrafb= bufimage.createGraphics(); bufimagegrafb.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); bufimagegrafb.setStroke(new BasicStroke(2.5f)); bufimagegrafb.setColor(new Color(255,255,0)); raggio = 40; ncerchi= 48; diametro= pi*2*raggio; scelta = scelta; fuori: for(k0=0;k0<=pi2-0.33;k0=(k0+pi/ncerchi)){ //il ciclo per disegnare i 46 cerchi, k0 è inferiore a pi2 perchè altrimenti uscirebbe dall'applet ci=(ci+1); q=0; for(a=0+k0;a<=pi2+k0;a=(a+pi2*5)){ // q2=0 ; for(aa=0+a;aa<=pi2+a;aa=(aa+pi/4)){ // // il ciclo fa in modo che si disegni un punto a d ogni passo q2= q2+1; xe2= 540- (Math.cos(aa+a))*raggio-lll; ye2= Math.sin(aa+a)*raggio+100; bastx= 540- (Math.cos(aa+a)*raggio*scelta)-lll ; //x dell pallino basty= Math.sin(aa+a)*raggio*scelta+100; // y del pallino // fa in modo che si disegni una sola curva if (q2 == (1) ){ n=3; } else { n=0; } bufimagegraf.clearRect((int)(xe2),(int)(38),123,133);//cancella la ruota con l'asta cog.draw( new Ellipse2D.Float((int)(bastx),(int)(basty),n,n));//disegna i pallini bufimagegrafb.draw( new Line2D.Float((int)(540),(int)(142),12,142));//disegna la riga sotto la ruota xx= (xe2 ) ; yy=ye2; } try { Thread.sleep(rallenta); } catch (InterruptedException e) { break; } for(aa=-0.12+a;aa<=pi2+a;aa=(aa+pi/16)){ xe2= 540- (Math.cos(aa+a)*raggio) -lll; ye2= Math.sin(aa+a)*raggio+100; bufimagegraf.draw( new Line2D.Double((int)(xx),(int)(yy),(int)xe2,(int)(ye2))); bufimagegraf.draw( new Line2D.Double((int)(540-lll),(int)(100),(int)(xe2 ),(int)(ye2))); xx= (xe2 ) ; yy=ye2; } // */ bastx= 540- (Math.cos(aa+a-0.1)*raggio*scelta)-lll ; basty= Math.sin(aa+a-0.1)*raggio*scelta+100; bufimagegrafb.draw( new Line2D.Double((int)(540-lll),(int)(100),(int)(bastx ),(int)(basty)));//disegna l'asta } cerchi= (diametro/ ncerchi); // corrisponde alla misura che bisogna moltiplicare per cos di pigreco // per spostarsi sull'asse delle X lll= lll- ( Math.cos(pi)*cerchi) ; //lll= ogni volta che si disegna un cerchio con lll abbiamo il valore da sommare alla X xe= xe2; yy=ye2; g2.drawImage(bufimage,0,0, this); g2.drawImage(co,0,0, this); if (ci <= 1 ){k0 = PI*2 ;continue fuori; } //permette di non ripetere l'apertura } g2.setColor(new Color(255,0,0,255)); g2.drawOval((int)((480-2)), (int)145,1,30); g2.drawOval((int)((228-2)), (int)145,1,30); g.setColor(new Color(255,255,0,255)); // /** g2.drawString(" La linea di base tra le due righe rosse è = al diametro della ruota per 3.14159265 " , 12,209); g2.drawString(" Mentre l'area sotto un arco della cicloide è 3 volte quella della ruota " , 12,229); g2.drawString(" L'arco tra 2 cuspidi è lungo 4 volte il diametro della ruota " , 12,249); g2.drawString(" applet by Sergio Savoldelli - www.savoldelli.net - Agosto 2011 " , 12,269); // */ } public void mouseClicked(MouseEvent e) { Object source = e.getSource(); lll=0; int aaaa= e.getButton(); if ((Object) source== (Object) cicloide && aaaa == 1){ scelta = 1; lll=0; repaint(); } if ((Object) source== (Object)cicloideri && aaaa == 1) { scelta = 1.5; lll=0; repaint(); } if ((Object) source== (Object)diametrob && aaaa == 1) { lll=0; scelta = 0.60; repaint(); } if ((Object) source== (Object)rall && aaaa == 1) { q3=(q3+1)%2; //di = 2; lll=0; if (q3 >= 1) { rallenta =45; rall.setLabel(" Più veloce");} if (q3== 0) {rallenta = 15;rall.setLabel("Rallenta");} repaint(); } } //////////////////// public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseDragged(MouseEvent e) { } public void destroy() { removeMouseListener(this); removeMouseMotionListener(this); } }