为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2021-09-12 16:27:12
为避免浪费您的时间,我将简短说明:我的项目: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); 它应该反转整个过程,但它不会这是预期的缩放:
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

解决方案相当简单。问题是试图一次计算放大以及移动到新的中点。


由于移动到新的中点取决于放大,因此您不能将其放入一个等式中,或者至少需要付出很多努力。


我改变了我的代码,如下所示,所以我首先计算放大,然后将锚点移动到想要的位置。有时,更长的路是更好的路。


//The new midpoint needs the old stepwith to calculate correctly

Complex newmidpoint = new Complex(upleft.getReal()+x*stepwidth, upleft.getImg()-y*stepwidth);


//zooming in

double 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 stepwidth

Complex 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);


查看完整回答
反对 回复 2021-09-12
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信