返回顶部
首页 > 资讯 > 精选 >Simplifying Graphics With Java and Threads (转)
  • 734
分享到

Simplifying Graphics With Java and Threads (转)

2023-06-03 02:06:18 734人浏览 八月长安
摘要

Simplifying Graphics With Java and Threads (转)[@more@]Simplifying Graphics With Java and ThreadsBy Alex Chaffee and John

Simplifying Graphics With Java and Threads (转)[@more@]

Simplifying Graphics With Java and Threads

By Alex Chaffee and John Papageorge
July 1997

<!-- Begin Main Body Text -->

Here's some code that EarthWEB's Alex Chaffee likes to use as an example of how Java can be used to simplify alGorithms by combining graphics with threading to render complex graphics.

Basically there are three threads: a Renderer, which perfORMs a complex calculation; an Animator, which wakes up periodically and draws the current image to the screen; and of course the default User Interface thread, which responds to user events and changes the display as appropriate.

The Renderer runs at a low priority—just grinding away forever, or at least until it's done; it shouldn't interfere with the other two threads. The Animator only comes to life every 500 msec or so, to avoid the expense of drawing each pixel.

To perfoRM a specific calculation, subclass the Renderer to make a Mandelbrot function. Note the object-oriented design: this way, the Mandelbrot subclass only needs to override the Run method and doesn't have to worry about the threading implementation, which is handled by its superclass. Of course, in this example, the threading implementation is trivial, but this is a teaching exercise.

Other items of note are the use of an offscreen Graphics buffer, and the use of progressive rendering. The code makes several rough passes over the image, calculating the value in each quadrant, then gradually refines the view. Unlike .netscape's rendering of progressive gifs, this program treats a calculated pixel as the "center" of a square of color, not as the top corner or a pixel-wide stripe, and so avoids that odd venetian-blind scrolling-up effect. With a laugh, Chaffee says, "But maybe I'm the only one in the world who thought Netscape's gif-rendering algorithm looked funny." now , see Chaffee's source code

import java.awt.*;import java.util.*;import java.applet.*;import java.lang.Math;class Animator implements Runnable { static int delay = 500; private Applet applet; private Vector images; private Thread thread = null; private int frame; public Animator(Applet appletIn, Vector imagesIn) { applet = appletIn; images = imagesIn; } public void start() { if (thread == null) { thread = new Thread(this); thread.start(); } } public void stop() { System.out.println("Animator stopped"); thread.stop(); thread = null; } public void run() { thread.setPriority(Thread.MAX_PRIORITY-1); while (thread != null) { applet.repaint(); try { thread.sleep(delay); } catch (InterruptedException e) {}; // Increment frame // Must use synchronized on the off chance that update gets called // between the frame++ and the frame=0 synchronized (this) { frame++; if (frame > images.size()) { frame = 0; } } } } public void paint(Graphics g) { if (frame <images image image="(Image)images.elementAt(frame);" image="if" try it without an imageobserver renderer this class progressively renders the image class renderer implements runnable protected image protected thread thread="null;" thread="protected" int delay="50;" delay="static" int count="0;" count="public" image="imageIn;" image="}" public void if thread="new" thread="Thread(this," public void thread="null;" thread="}" public void public void subclasses renderer in order to implement a mandelbrot function class mandelbrot extends renderer zoom constant protected static float kzoom="(float)1.3;" kzoom=" int mag; float originX = 0; float originY = 0; public Mandelbrot(Image image, int mag, float originX, float originY) { super(image); this.mag = mag; this.originX = originX; this.originY = originY; } static float MagToSpan(int mag) { return 4 / (float)(java.lang.Math.pow(kZoom, mag)); } public void run() { Graphics g; g = image.getGraphics(); int width, height; width = image.getWidth(null); height = image.getHeight(null); float span = MagToSpan(mag); int resolution; int resolutionMax = 10; // should calculate based on image size float inc; resolution = 1; int widthPixel, heightPixel; do { // the resolution determines which power of two we're dividing // the span by -- so it fills in by squares float scale = 1 / (float)(java.lang.Math.pow(2, resolution)); inc = span * scale; // pre-calculate the width and height of each "pixel" in the image widthPixel = (int)(scale * width) + 1; heightPixel = (int)(scale * height) + 1; spew("resolution " + resolution + " pixel=(" + widthPixel + ", " +heightPixel + ")"); // Mandelbrot function Color c; int maxiterations = 100; int i; float temp, r, x, y; float minX = originX + inc/2; float maxX = originX + span; float minY = originY + inc/2; float maxY = originY + span; for (float c1= minX; c1 <maxX for nitty merci benoit r="0;" r="x" y="0;" y="i" while r="x*x" r="+" temp="x*x" temp="-" y="2*x*y" y="+" x="temp;" x="i++;" now i is the so base color on it if c="Color.black;" c="}" else all sorts of different color palettes -- we should parameterize c="new" c="Color(i*2," - c="new" c="Color(i*2," - c="new" c="Color(i*2," - c="new" c="Color(i*2," - should optimize by incrementing screen href="tag-273-1.html">os rather than // recalculating int h = (int)(((c1 - originX)*width)/span); int v = (int)(((c2 - originY)*height)/span); // center on the point, not upper-left h -= widthPixel/2; v -= heightPixel/2; g.setColor(c); g.fillRect(h, v, widthPixel, heightPixel); Thread.currentThread().yield(); } } // for traverse virtual space resolution++; } while (widthPixel > 1 || heightPixel > 1); spew("stopped"); } // method run void spew(String str) { System.out.println("(" + originX + "," + originY + ")x" + mag + ":" + str); } public static int iterate(float c1, float c2) { int maxiterations = 100; // Nitty gritty, merci Benoit float r, x, y, temp; int i; r = 0; x = 0; y = 0; i = 0; while ((i<maxiterations r="x*x" r="+" temp="x*x" temp="-" y="2*x*y" y="+" x="temp;" x="i++;" return man - the main applet class public class man extends applet private int cimages="1;" cimages="private" vector images="null;" images="private" vector renderers="null;" renderers="private" animator animator="null;" animator="float" originx="(float)-2.0;" originx="float" originy="(float)-2.0;" originy="/**" magnification of the first frame in the list int mag="0;" mag="public" void read the parameters string try if originx="new" originx="Float(str).floatValue();" if originy="new" originy="Float(str).floatValue();" if mag="new" mag="Integer(str).intValue();" catch void fill the vector with blank images images="new" images="Vector(cImages);" for i="0;" i="icImages;" image image="createImage(" image="size().width," start each rendering thread renderers="new" renderers="Vector(cImages);" for i="0;" i="icImages;" renderer renderer="new" renderer="Mandelbrot((Image)images.elementAt(i)," start the animator animator="new" animator="Animator(this," a repaint for good measure public void stop all threads public void for i="0;" i="icImages;" must override to reduce flicker public void public void events public boolean int case case zoom in return case zoom out if>0) zoom(mag-1); return true; default: return false; } // switch } // keyDown void zoom(int magNew) { float spanOld = Mandelbrot.MagToSpan(mag); float centerX = originX + spanOld/2; float centerY = originY + spanOld/2; mag = magNew; float spanNew = Mandelbrot.MagToSpan(mag); originX = centerX - spanNew/2; originY = centerY - spanNew/2; stopThreads(); startThreads(); } public boolean mouseDown(Event evt, int x, int y) { System.out.println(evt.toString()); stopThreads(); animator = null; float span = Mandelbrot.MagToSpan(mag); originX = x * span / size().width + originX - span/2; originY = y * span / size().height + originY - span/2; System.out.println("New origin: " + x + (new Dimension(x,y)).toString()+ " -> " + originX + "," + originY ); start(); return true; } static float convert(int x, int width, int mag, float origin) { float span = Mandelbrot.MagToSpan(mag); float z = x * span/width + origin; return z; } public boolean mouseMove(Event evt, int x, int y) { float vx = convert(x, size().width, mag, originX); float vy = convert(y, size().height, mag, originY); int i = Mandelbrot.iterate(vx, vy); String str = "i=" + (new Integer(i)).toString(); str = str + " (" + vx + ", " + vy + ")"; getAppletContext().showStatus(str);// System.out.println((new Integer(i)).toString()); return true; }}

--结束END--

本文标题: Simplifying Graphics With Java and Threads (转)

本文链接: https://lsjlt.com/news/232274.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Simplifying Graphics With Java and Threads (转)
    Simplifying Graphics With Java and Threads (转)[@more@]Simplifying Graphics With Java and ThreadsBy Alex Chaffee and John...
    99+
    2023-06-03
  • java-servlet-转发AND路径(详解)
    1.转发:a) 什么是转发?一个web组件将未完成的任务交给另一个web组件继续做.通常是一个servlet将数据获取之后转交给jsp进行展现.注:web组件值得是servlet或者jspb) 如何转发?1.将数据绑定到request对象上...
    99+
    2023-05-30
    java servlet 转发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作