JPanel 上的自定义放大/缩小不是线性的

为避免浪费您的时间,我将简短说明:


我的项目:Mandelbrot 集的图形演示。


我的进度:完成除了放大/缩小功能中的错误


错误:放大比例比缩小比例小(慢)


较短的版本:如何在 jpanel 上模拟放大/缩小。


最后应该将 jPanel 的一小部分放大到整个 jPanel。jPanel 中的每个像素都代表一个整数,但您不必担心放大后缺少整数。


更长的版本(仅当您需要更多信息时):


Mandelbrot 集合中的缩放函数:


public void recalculate(int x, int y, int width, int height, double scale){

    downright=new Complex(upleft.getReal()+stepwidth*(x+width/scale),upleft.getImg()-stepwidth*(y+height/scale));

    upleft=new Complex(upleft.getReal()+stepwidth*(x-width/scale), upleft.getImg()-stepwidth*(y-height/scale));

    stepwidth=(downright.getReal()-upleft.getReal())/width;

    calc(lastrep);

}

一个简短的术语:


downright 是右下角的复数,是要在 jpanel 上绘制的最后一个像素

因此,upleft 是左上角的复数,即要在 jpanel 上绘制的第一个像素

stepwidth 是由一个像素表示的每个复数之间的距离

calc 最后是根据 Mandelbrot 设置规则计算每个像素的每种颜色的函数

宽度和高度参数是 jpanel 的像素宽度/高度,x 和 y 是放大和缩放缩放因子的坐标。


当我调用这个函数时mandelbrot.recalculate(x,y, getWidth(), getHeight(), 10);,这应该放大点 (x,y) 以便新表示的图像是实际图像的 1/5。


1/5 应该是因为图像的开始(左上)是全宽和全高的像素量的 1/10 移动到点 (x,y) 的上左和图像的末尾( downright) 是整个宽度和高度的像素量的 1/10 向下和向右移动。


因此,如果我像这样在放大后调用该函数:mandelbrot.recalculate(x,y, getWidth(), getHeight(), 0.1); 它应该反转整个过程,但它不会


这是预期的缩放:

http://img1.mukewang.com/613dba000001824808740761.jpg

慕桂英4014372
浏览 99回答 1
1回答

慕妹3242003

解决方案相当简单。问题是试图一次计算放大以及移动到新的中点。由于移动到新的中点取决于放大,因此您不能将其放入一个等式中,或者至少需要付出很多努力。我改变了我的代码,如下所示,所以我首先计算放大,然后将锚点移动到想要的位置。有时,更长的路是更好的路。//The new midpoint needs the old stepwith to calculate correctlyComplex newmidpoint = new Complex(upleft.getReal()+x*stepwidth, upleft.getImg()-y*stepwidth);//zooming indouble distwidth = downright.getReal()-upleft.getReal();double distheight = upleft.getImg()-downright.getImg();double newreal = upleft.getReal()+(1/scale)*distwidth;double newimg = upleft.getImg()-(1/scale)*distheight;downright=new Complex(newreal, newimg);stepwidth=(downright.getReal()-upleft.getReal())/width;//the old midpoint is actually the already zoomed in midpoint, it needs the new stepwidthComplex oldmidpoint = new Complex(upleft.getReal()+width/2.0*stepwidth,upleft.getImg()-height/2.0*stepwidth);Complex diffmidpoint = newmidpoint.subtract(oldmidpoint);upleft=new Complex(upleft.getReal()+diffmidpoint.getReal(),upleft.getImg()+diffmidpoint.getImg());downright=new Complex(downright.getReal()+diffmidpoint.getReal(), downright.getImg()+diffmidpoint.getImg());calc(lastrep);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java