//****************************************************************************** // mandelbrot.java: Applet // //****************************************************************************** import java.applet.*; import java.awt.*; //============================================================================== // Main Class for applet mandelbrot // //============================================================================== public class mandelbrot extends Applet { final int m = 1000; int i, j, imax, jmax, count; double x, y, a, b, a2, b2, dx, dy; final Color c[] = {Color.black, Color.blue, Color.red, Color.magenta, Color.green, Color.cyan, Color.yellow, Color.white}; int iColor[] = new int[m+1]; boolean candraw = false; // ÄÁÆ®·Ñ in ÄÞÆ÷³ÍÆ® //-------------------------------------------------------------------------- double minX = -0.9; // ¿À´õ Scrollbar hsb_minX; TextField txt_minX; double maxX = 2.1; // ¿À´õ Scrollbar hsb_maxX; TextField txt_maxX; double minY = -1.2; // ¿À´õ Scrollbar hsb_minY; TextField txt_minY; double maxY = 1.2; // ¿À´õ Scrollbar hsb_maxY; TextField txt_maxY; int maxiter = 20; Scrollbar hsb_maxiter; TextField txt_maxiter; Button btn_run; // ½ÇÇà ¹öư // mandelbrot Class Constructor //-------------------------------------------------------------------------- public mandelbrot() { // TODO: Add constructor code here } // APPLET INFO SUPPORT: // The getAppletInfo() method returns a string describing the applet's // author, copyright date, or miscellaneous information. //-------------------------------------------------------------------------- public String getAppletInfo() { return "Name: mandelbrot\r\n" + "Author: DongJoon. Lee\r\n" + "Created with Microsoft Visual J++ Version 1.0"; } // The init() method is called by the AWT when an applet is first loaded or // reloaded. Override this method to perform whatever initialization your // applet needs, such as initializing data structures, loading images or // fonts, creating frame windows, setting the layout manager, or adding UI // components. //-------------------------------------------------------------------------- public void init() { // If you use a ResourceWizard-generated "control creator" class to // arrange controls in your applet, you may want to call its // CreateControls() method from within this method. Remove the following // call to resize() before adding the call to CreateControls(); // CreateControls() does its own resizing. //---------------------------------------------------------------------- resize(600, 300); setBackground(Color.white); setForeground(Color.black); setLayout(null); // Á¦ÀÛÀÚ Ç¥½Ã Label lbl_copyright = new Label("Java Designed by LeeDongJoon", Label.RIGHT); add(lbl_copyright); lbl_copyright.reshape(size().width-200, size().height-20, 200, 20); // min X Label lbl_minX = new Label("¿¡¼­ ~ x ¹üÀ§ (range x) ~ ±îÁö", Label.CENTER); add(lbl_minX); lbl_minX.reshape(410, 20, 190, 20); hsb_minX = new Scrollbar(Scrollbar.HORIZONTAL, (int)(minX*10), 5, (int)(minX*10), (int)(maxX*10)-1); add(hsb_minX); hsb_minX.reshape(410, 40, 90, 20); txt_minX = new TextField(String.valueOf(minX), 20); add(txt_minX); txt_minX.reshape(410, 60, 90, 20); // max X hsb_maxX = new Scrollbar(Scrollbar.HORIZONTAL, (int)(maxX*10), 5, (int)(minX*10)+1, (int)(maxX*10)); add(hsb_maxX); hsb_maxX.reshape(510, 40, 90, 20); txt_maxX = new TextField(String.valueOf(maxX), 20); add(txt_maxX); txt_maxX.reshape(510, 60, 90, 20); // min Y Label lbl_minY = new Label("¿¡¼­ ~ y ¹üÀ§ (range y) ~ ±îÁö", Label.CENTER); add(lbl_minY); lbl_minY.reshape(410, 90, 190, 20); hsb_minY = new Scrollbar(Scrollbar.HORIZONTAL, (int)(minY*10), 5, (int)(minY*10), (int)(maxY*10)-1); add(hsb_minY); hsb_minY.reshape(410, 110, 90, 20); txt_minY = new TextField(String.valueOf(minY), 20); add(txt_minY); txt_minY.reshape(410, 130, 90, 20); // max Y hsb_maxY = new Scrollbar(Scrollbar.HORIZONTAL, (int)(maxY*10), 5, (int)(minY*10)+1, (int)(maxY*10)); add(hsb_maxY); hsb_maxY.reshape(510, 110, 90, 20); txt_maxY = new TextField(String.valueOf(maxY), 20); add(txt_maxY); txt_maxY.reshape(510, 130, 90, 20); // maxiter Label lbl_maxiter = new Label("ÃÖ´ë ¹Ýº¹¼ö (repeat term)", Label.LEFT); add(lbl_maxiter); lbl_maxiter.reshape(410, 170, 190, 20); hsb_maxiter = new Scrollbar(Scrollbar.HORIZONTAL, maxiter, 10, 10, 50); add(hsb_maxiter); hsb_maxiter.reshape(410, 190, 90, 20); txt_maxiter = new TextField(String.valueOf(maxiter), 20); add(txt_maxiter); txt_maxiter.reshape(510, 190, 90, 20); // ½ÇÇà ¹öư btn_run = new Button("±×¸®±â ½ÃÀÛ ÇÕ´Ï´Ù (Start)"); add(btn_run); btn_run.reshape(410, 230, 190, 20); } // Place additional applet clean up code here. destroy() is called when // when you applet is terminating and being unloaded. //------------------------------------------------------------------------- public void destroy() { // TODO: Place applet cleanup code here } // mandelbrot Paint Handler //-------------------------------------------------------------------------- public void paint(Graphics g) { if(!candraw) return; // ÆæÀÇ »ö ¼³Á¤ g.setColor(Color.black); dx = maxX - minX; dy = maxY - minY; if((dx * 400) > (dy * 300)) { imax = 400; jmax = (int)(400 * dy / dx + 0.5); } else { imax = (int)(300 * dx / dy + 0.5); jmax = 300; } dx /= imax; dy /= jmax; iColor[0] = 0; j = 7; for(i = maxiter; i > 0; i--) { iColor[i] = j; if(j > 1) j--; } for(i = 0; i <= imax; i++) { x = minX + i * dx; for(j = 0; j <= jmax; j++) { y = maxY - j * dy; a = x; b = y; a2 = a * a; b2 = b * b; count = maxiter; while((a2 + b2) <= 4 && count > 0) { b = 2 * a * b - y; a = a2 - b2 - x; a2 = a * a; b2 = b * b; count--; } g.setColor(c[iColor[count]]); g.fillRect(i, j, 1, 1); } } candraw = false; } // The start() method is called when the page containing the applet // first appears on the screen. The AppletWizard's initial implementation // of this method starts execution of the applet's thread. //-------------------------------------------------------------------------- public void start() { // TODO: Place additional applet start code here } // The stop() method is called when the page containing the applet is // no longer on the screen. The AppletWizard's initial implementation of // this method stops execution of the applet's thread. //-------------------------------------------------------------------------- public void stop() { } // ÇÚµé À̺¥Æ® //-------------------------------------------------------------------------- //public boolean action(Event evt, Object what) public boolean handleEvent(Event evt) { // ½ºÅ©·Ñ ¹Ù if(evt.target == hsb_minX) { minX = hsb_minX.getValue() / 10.; if(maxX <= minX) { maxX = minX + 0.1; hsb_maxX.setValue((int)(maxX*10.)); } txt_minX.setText(String.valueOf(minX)); txt_maxX.setText(String.valueOf(maxX)); return true; } if(evt.target == hsb_maxX) { maxX = hsb_maxX.getValue() / 10.; if(maxX <= minX) { maxX = minX + 0.1; hsb_maxX.setValue((int)(maxX*10.)); } txt_maxX.setText(String.valueOf(maxX)); return true; } if(evt.target == hsb_minY) { minY = hsb_minY.getValue() / 10.; if(maxY <= minY) { maxY = minY + 0.1; hsb_maxY.setValue((int)(maxY*10.)); } txt_minY.setText(String.valueOf(minY)); txt_maxY.setText(String.valueOf(maxY)); return true; } if(evt.target == hsb_maxY) { maxY = hsb_maxY.getValue() / 10.; if(maxY <= minY) { maxY = minY + 0.1; hsb_maxY.setValue((int)(maxY*10.)); } txt_maxY.setText(String.valueOf(maxY)); return true; } // ½ºÅ©·Ñ ¹Ù if(evt.target == hsb_maxiter) { maxiter = hsb_maxiter.getValue(); txt_maxiter.setText(String.valueOf(maxiter)); return true; } // ±×¸®±â ¹öư if(evt.target == btn_run && evt.id == Event.ACTION_EVENT) { candraw = true; repaint(); return true; } return false; } }