⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch14.htm

📁 JAVA Developing Professional JavaApplets
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} // endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</TT></BLOCKQUOTE><HR><H2><A NAME="TheMandelZoomAppClass"><FONT SIZE=5 COLOR=#FF0000>TheMandelZoomApp Class</FONT></A></H2><P>Listing 14.7 shows the MandelZoomApp class, which represents thischapter's main applet; its function was described earlier, inthe section &quot;Using the Applets.&quot; See this section andTable 14.1 for how to use the applet.<P>The most interesting features in the code are the routines formarking the region to be highlighted. Each pixel on the displayedMandelbrot image maps an x-y value to a real-imaginary value ofthe <TT>c</TT> value of the Mandelbrotformula shown in Formula 14.1. Whenever you move the cursor, thecurrent real-imaginary values are shown in the browser's statusbar. When you highlight an area to zoom in on, you are reallypicking a range of <TT>c</TT> valuesto be explored. All the double variables are used for trackingthis range of values. These values are read in at initializationby the <TT>loadParameters()</TT> methodto match the bitmap that's displayed. You can specify other MandelbrotBMP files and corresponding data files by changing the <TT>filename</TT>parameter of the applet's <TT>&lt;APPLET&gt;</TT>tag.<P>The <TT>Zoom()</TT> method takes thecurrently highlighted range and brings up a new Mandelbrot imagethat corresponds to this range. It uses the same calculation-imagefiltering techniques that the MandelApp class does.<HR><BLOCKQUOTE><B>Listing 14.7. The MandelZoomApp class.<BR></B></BLOCKQUOTE><BLOCKQUOTE><TT>// This applet displays the Mandelbrotset bitmap specified<BR>// in the APPLET tag parameters.&nbsp;&nbsp;You can then zoomand in<BR>// and out of the bitmap by dragging a region to paint.<BR>// And then clicking on the appropriate option...<BR>// Z or z - Zoom<BR>// S or s - Save.<BR>public class MandelZoomApp extends Applet&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Image img;<BR>&nbsp;&nbsp;&nbsp;boolean zoomOn = false;<BR>&nbsp;&nbsp;&nbsp;double XLeft,XRight,YTop,YBottom,XDelta,YDelta;<BR>&nbsp;&nbsp;&nbsp;double currentX,currentY;<BR>&nbsp;&nbsp;&nbsp;double startX,startY,endX,endY;&nbsp;&nbsp;//Zooming coordinates...<BR>&nbsp;&nbsp;&nbsp;Rectangle markingRectangle;&nbsp;&nbsp;// Zoomingrectangle...<BR>&nbsp;&nbsp;&nbsp;Mandelbrot m; // Creates the Mandelbrot image...<BR>&nbsp;&nbsp;&nbsp;int NUMCOLS = 640;&nbsp;&nbsp;&nbsp;// Dimensionsimage display...<BR>&nbsp;&nbsp;&nbsp;int NUMROWS = 350;<BR>&nbsp;&nbsp;&nbsp;boolean complete = false;<BR>&nbsp;&nbsp;&nbsp;// Array for keeping track of Mandelbrot entries...<BR>&nbsp;&nbsp;&nbsp;MandelEntry me[];<BR>&nbsp;&nbsp;&nbsp;int lastIndex;&nbsp;&nbsp;// Top of array...<BR>&nbsp;&nbsp;&nbsp;int currentIndex;<BR><BR>&nbsp;&nbsp;&nbsp;// Set up the Mandelbrot set specified in theparameters...<BR>&nbsp;&nbsp;&nbsp;public void init() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Get parameter of bitmapto display...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String filename;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((filename = getParameter(&quot;filename&quot;))== null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filename= &quot;mandel1&quot;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Load the bitmap...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadBitmap(filename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Initialize Mandelbrot array...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me = new MandelEntry[40];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me[0] = new MandelEntry(null,img,XLeft,XRight,YTop,YBottom);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastIndex = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentIndex = 0;<BR>&nbsp;&nbsp;&nbsp;}<BR><BR><BR>&nbsp;&nbsp;&nbsp;// ZOOM onto Mandelbrot set if all is good...<BR>&nbsp;&nbsp;&nbsp;void Zoom() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// No Zooming if off or norectangle...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((!zoomOn) || (markingRectangle== null)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Nothingmarked or Zooming disable...&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} // end if<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// See if Mandelbrot tableis full...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((lastIndex + 1) &gt;=me.length) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Mandelbrottable full. Clear with C before zooming&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;ZOOM: SX=&quot;+ startX + &quot; SY=&quot; + startY + &quot; EX=&quot; + endX+ &quot; EY=&quot; + endY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Load new Mandelbrot...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;complete = false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoomOn = false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;markingRectangle = null; //Reset marking rectangle...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m = new Mandelbrot(NUMCOLS,NUMROWS,endX,startX,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endY,startY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img = m.getImage();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Store in Mandelbrot table...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XLeft = startX;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XRight = endX;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YTop = startY;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YBottom = endY;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XDelta = Math.abs(XRight -XLeft);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YDelta = Math.abs(YBottom- YTop);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++lastIndex;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me[lastIndex] = new MandelEntry(m,img,startX,endX,startY,endY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentIndex = lastIndex;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Calculating...&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint();<BR>&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;// Paint on update...<BR>&nbsp;&nbsp;&nbsp;public void update(Graphics g) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint(g);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;public synchronized void paint(Graphics g) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (img == null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Show image...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawImage(img,0,0,this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Show marking rectangleif exists...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (markingRectangle != null){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawRect(markingRectangle.x,markingRectangle.y,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;markingRectangle.width,markingRectangle.height);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} // end if<BR>&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;// Will get updates as set is being created.<BR>&nbsp;&nbsp;&nbsp;// Repaint when they occur...<BR>&nbsp;&nbsp;&nbsp;public boolean imageUpdate(Image im,int flags,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x, int y, int w, int h){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((flags &amp; FRAMEBITS)!= 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((flags &amp; ALLBITS)!= 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;ImageComplete!&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;complete= true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoomOn =true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;// Load a bitmap and accompanying data file...<BR>&nbsp;&nbsp;&nbsp;void loadBitmap(String filename) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Zoom is false unless bothsucceed...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoomOn = false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;markingRectangle = null; //Reset marking rectangle...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Load the bitmap...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Loadimage...&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageProducerproducer = BmpImage.getImageProducer(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getDocumentBase(),filename + &quot;.bmp&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img = createImage(producer);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Imageloaded...&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (AWTException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Cannotopen file &quot; + filename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Load the zoom parameters.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Turn Zoom on if all works...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadParameters(filename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoomOn =true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;complete= true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Cannotload parameter data. &quot; + e.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;// Load the parameters.&nbsp;&nbsp;Throw IOException...<BR>&nbsp;&nbsp;&nbsp;public void loadParameters(String filename)throws IOException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Create URL for data...<BR>&nbsp;&nbsp;&nbsp;&nbsp;URL u;<BR>&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u = new URL(getDocumentBase(),filename+ &quot;.dat&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;catch (MalformedURLException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showMsg(&quot;Bad Data URL&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(&quot;BadURL&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Now load the data by opening up a stream<BR>&nbsp;&nbsp;&nbsp;&nbsp;// to the URL...<BR>&nbsp;&nbsp;&nbsp;&nbsp;DataInputStream dis = new DataInputStream(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new BufferedInputStream(u.openStream()) );<BR>&nbsp;&nbsp;&nbsp;&nbsp; // Read only the first line...<BR>&nbsp;&nbsp;&nbsp;&nbsp; String param = dis.readLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp; // Tokenize out the boundary values....<BR>&nbsp;&nbsp;&nbsp;&nbsp; StringTokenizer s = new StringTokenizer(param,&quot;,&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XLeft = Double.valueOf(s.nextToken()).doubleValue();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XRight = Double.valueOf(s.nextToken()).doubleValue();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YTop = Double.valueOf(s.nextToken()).doubleValue();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YBottom = Double.valueOf(s.nextToken()).doubleValue();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XDelta = Math.abs(XRight- XLeft);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -