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.*; /** * Class spirodef3b - Simulatore spirografo 3D e stereo * @author (Sergio Savoldelli.- wwww.savoldelli.net) * @version (number 3. - 05/2011 ) */ public class spirodef3b extends JApplet implements MouseListener, MouseMotionListener { public double z = 0.2; public double pi=3.14159265; public double yz = 0.02; public double pi2=pi*2; public double pi3=pi2*2; public int rg,rp,aq; public double Rr,k=60.0,n1=20.0,n2=60.0; public int mov1,mov2,mov3,mov4,a2,qq,q3,modulo,N,w1,w2,p; public double aa,hh,k0,k02,r0,r02,k03,xe2,ye2,xe2c,ye2c,x04,x,y,xx,yy,t,t2,k2r, dd,puntas,pu, puntoy, puntox,puntoy2, puntox2,x05,x06, rotx,roty,aa2,aa3,tt,zz, vueltas,c,b,r3,r2,mcd,qqq,qqqq, q2 ; Font font; Panel controlPanel, optionPanelColor, optionPanel0; Scrollbar sliderR, sliderr, sliderO; public boolean movingCircleOut = false; String sliderTextR = "a= Ruota Maggiore(5-60)"; String sliderTextr = "b= ruota minore(2-60)"; String sliderTextO = "c= Distanziatore(1-60)"; String sliderTextC = " - Stereo - "; Label sliderLabelR, sliderLabelr, sliderLabelO, sliderLabelC, titleLabel; Checkbox insideCheckbox, outsideCheckbox; public void init() { setSize(1070, 440); setBackground(Color.black); setLayout(new BorderLayout()); controlPanel = new Panel(); controlPanel.setBackground(Color.black); controlPanel.setLayout(new GridLayout(13,1)); add("East", controlPanel); addMouseListener(this); addMouseMotionListener(this); titleLabel = new Label("Spirografo 3D ", 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(" ")); sliderLabelR = new Label(sliderTextR + Integer.toString ((int)n2)); font = new Font("Helvetica", Font.PLAIN, 12); sliderLabelR.setFont(font); sliderLabelR.setBackground(Color.black); sliderLabelR.setForeground(Color.white); controlPanel.add(sliderLabelR); sliderR = new Scrollbar(Scrollbar.HORIZONTAL, (int)n2, 1, 5,61); controlPanel.add(sliderR); sliderLabelr = new Label(sliderTextr + Integer.toString((int)n1)); font = new Font("Helvetica", Font.PLAIN, 12); sliderLabelr.setFont(font); sliderLabelr.setBackground(Color.black); sliderLabelr.setForeground(Color.white); controlPanel.add(sliderLabelr); sliderr = new Scrollbar(Scrollbar.HORIZONTAL,(int) n1, 1, 2, 61); controlPanel.add(sliderr); sliderLabelO = new Label(sliderTextO + Integer.toString((int)k)); font = new Font("Helvetica", Font.PLAIN, 12); sliderLabelO.setFont(font); sliderLabelO.setBackground(Color.black); sliderLabelO.setForeground(Color.white); controlPanel.add(sliderLabelO); sliderO = new Scrollbar(Scrollbar.HORIZONTAL, (int)k, 1, 1, 61); controlPanel.add(sliderO); controlPanel.add(new Label(" ")); sliderLabelC = new Label(sliderTextC); CheckboxGroup CircleInOutGroup = new CheckboxGroup (); insideCheckbox = new Checkbox("si", CircleInOutGroup, !movingCircleOut); outsideCheckbox = new Checkbox("no", CircleInOutGroup, movingCircleOut); insideCheckbox.setForeground(Color.green); outsideCheckbox.setForeground(Color.cyan); font = new Font("Helvetica", Font.BOLD, 18); insideCheckbox.setFont(font); outsideCheckbox.setFont(font); optionPanel0 = new Panel(); optionPanel0.setLayout(new GridLayout(1, 3)); font = new Font("Helvetica", Font.BOLD, 18); sliderLabelC.setFont(font); sliderLabelC.setBackground(Color.red); sliderLabelC.setForeground(Color.white); optionPanel0.add(insideCheckbox); optionPanel0.add(outsideCheckbox); controlPanel.add(new Label(" ")); controlPanel.add(sliderLabelC,10); controlPanel.add("East", optionPanel0); } public boolean handleEvent(Event ev) { if (ev.target instanceof Scrollbar) { int value = ((Scrollbar)ev.target).getValue(); if (ev.target == sliderR) { sliderLabelR.setText(sliderTextR + Integer.toString(value)); n2 = value; } else if (ev.target == sliderr) { sliderLabelr.setText(sliderTextr + Integer.toString(value)); n1 = value; } else if (ev.target == sliderO) { sliderLabelO.setText(sliderTextO + Integer.toString(value)); k = value; } repaint(); } if ( ev.target == insideCheckbox || ev.target == outsideCheckbox) { repaint(); } return true; } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; Graphics2D big; BufferedImage bi; bi = new BufferedImage(990, 440, BufferedImage.TYPE_4BYTE_ABGR); big = bi.createGraphics(); big.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); big.setColor(new Color(255,0,0)); big.setStroke(new BasicStroke(2.2f)); rg = (int)n2; rp= (int)n1; Rr = rg+ rp; double p = (int)k; vueltas = (int)(n1 / mcd(n2,n1)); dd= pi2/120; big.clearRect(0,0,420,440); for(aa=-0.01*2;aa<= -pi2*2;aa=aa+(dd)){ x = Rr*Math.cos(aa)+ p* Math.cos((Rr/rp)*aa+z); y = Rr*Math.sin(aa)+ p* Math.sin((Rr /rp)*aa); xe2c= (int)x; ye2c= (int)y; xx = Rr*Math.cos(aa) + p* Math.cos((Rr /rp)*aa+z+0.15); yy = Rr*Math.sin(aa)+ p * Math.sin((Rr / rp)*aa+0.01); xe2= (int)xx; ye2= (int)yy; k0=(xe2)+218; r0= (ye2)+226; k02=xe2c+210; r02= ye2c+220; puntox2=k02;puntoy2=r02; puntox=k0;puntoy=r0; } rg = (int)n2; rp= (int)n1; Rr = rg+ rp; dd= pi2/(120); for(aa3=-0.01;aa3<= pi2*vueltas;aa3=aa3+(dd)){ x = Rr*Math.cos(aa3)+ p* Math.cos((Rr/rp)*aa3+z); y = Rr*Math.sin(aa3)+ p* Math.sin((Rr /rp)*aa3+yz); xe2c= (int)x; ye2c= (int)y; qqq= Math.cos((z/(rp/9.999))*(rp*2)/20); qqqq= Math.cos((z/(rp/9.999))*(rp*2)/20)*(p*2); xx = Rr*Math.cos(aa3) + p* Math.cos((Rr /rp)*aa3+0.15+z); yy = Rr*Math.sin(aa3) + p * Math.sin((Rr / rp)*aa3+0.01+yz); xe2= (int)xx; ye2= (int)yy; k0=(xe2)+218; r0= (ye2)+228; k02=xe2c+210; r02= ye2c+220; if (insideCheckbox.getState()){ w1 =255; w2= 255; } if (outsideCheckbox.getState()){ puntox= puntox -1000;puntoy= puntoy-1000; k0= k0-1000;r0= r0-1000; } big.setColor(new Color(w1,0,0)); big.drawLine((int)(puntox),(int)(puntoy),(int)k0,(int)r0); big.setColor(new Color(0,w2,0)); big.drawLine((int)(puntox2),(int)(puntoy2),(int)k02,(int)r02); puntox=k0;puntoy=r0; puntox2=k02;puntoy2=r02; } rg=rg*2;rp=rp*2; //inizio laterale big.clearRect(420,0,990,440); big.setColor(new Color(255,255,255)); big.drawOval((int)(580-rg),(int)(200-rg),(int)(rg*2),(int)(rg*2));//ruota grande for(aa2=-pi;aa2<=pi;aa2=aa2+(pi/8)){ tt= cos(aa2)*(rp)+qqq*rp+q2+rp; zz= sin(aa2)*(rp); big.setColor(new Color(0,255,0)); big.drawLine((int)((580+rg-rp)+qqq*rp+rp),(int)(200),(int)((580+rg-rp+tt)),(int)(200+zz));//raggi ruota } big.setColor(new Color(55,200,200)); big.drawOval((int)(580+rg-rp*2+qqq*rp+rp),(int)(200-rp),(int)((rp*2)),(int)(rp*2));//ruota piccola big.setColor(new Color(200,255,255)); big.drawLine((int)((580+rg-rp)+qqq*rp+rp),(int)(200),(int)(((580+rg-rp)+qqq*rp+rp)-qqqq),(int)(200)); big.setColor(new Color(0,255,0)); puntas= n2/n1; pu= r2; big.fillOval((int)(((580+rg-rp)+qqq*rp+rp)-qqqq),(int)(200-2),(int)(5),(int)(5)); try{ Thread.sleep(0); } catch(InterruptedException e){ } g2.drawImage(bi,0,0, this); } public double mcd(double n1, double n2){ double r1, r2, r3; if (n2 > n1) { r1 = n2; r2 = n1; } else { r1 = n1; r2 = n2; } r3 = (int)Math.IEEEremainder(r1, r2); while(r3 != 0){ r1 = r2; r2 = r3; r3 = Math.IEEEremainder(r1, r2); } return (int)Math.abs(r2); } public void mouseClicked(MouseEvent ev) { } public void mousePressed(MouseEvent ev) { mov2 = ev.getX(); int mov3 = ev.getY(); } public void mouseReleased(MouseEvent ev){ } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseDragged(MouseEvent ev) { mov1 = ev.getX(); mov4 = ev.getY(); z=z+0.04*((mov1-mov2));mov2=mov1; yz=yz +0.04* ((mov4-mov3));mov3=mov4; repaint(); } public void destroy() { removeMouseListener(this); removeMouseMotionListener(this); } }