QT学习教程(二十八)

双缓冲技术(Double Buffering)( PlotSettings 实现)

下面是PlotSettings 的实现:

PlotSettings::PlotSettings()
{
minX = 0.0;
maxX = 10.0;
numXTicks = 5;
minY = 0.0;
maxY = 10.0;
numYTicks = 5;
}

在构造函数中,把两个坐标轴的初始化为从 0 到 10,分为 5 个刻度。

void PlotSettings::scroll(int dx, int dy)
{
double stepX = spanX() / numXTicks; minX += dx * stepX;
maxX += dx * stepX;
double stepY = spanY() / numYTicks;
 
minY += dy * stepY; maxY += dy * stepY;
}

函数scroll()增加或者减少minX,maxX,minY,maxY 的值,放大或缩小控件的尺寸为给定的偏移值乘以坐标刻度的两倍。这个函数在 Plotter::keyPressEvent()函数中调用。

void PlotSettings::adjust()
{
adjustAxis(minX, maxX, numXTicks); 
adjustAxis(minY, maxY, numYTicks);
}

函数adjust()在 Plotter::mouseReleaseEvent()中调用。重新计算minX,maxX,minY, maxY 的值,重新得到坐标轴刻度的个数。私有函数 adjustAxis()一次计算一个坐标轴。

void PlotSettings::adjustAxis(double &min, double &max,
int &numTicks)
{
const int MinTicks = 4;
double grossStep = (max - min) / MinTicks; double step = pow(10.0, floor(log10(grossStep))); if (5 * step < grossStep) {
step *= 5;
} else if (2 * step < grossStep) { step *= 2;
}
numTicks = int(ceil(max / step) - floor(min / step)); if (numTicks < MinTicks)
numTicks = MinTicks;
min = floor(min / step) * step; max = ceil(max / step) * step;
}

函数adjustAxis()修正minX,maxX,minY,maxY 的值,根据给定的最大最小范围值计算刻度的个数。函数修改了参数的值(成员变量的值),所以没有使用常引用。前部分代码主要是确定坐标轴上单位刻度的值(step)。为了得到合理的刻度数,必须得到准确的步长值。例如,一个坐标轴步长为 3.8,坐标轴上其他的刻度值都是 3.8 的倍数,在用户很不习惯,对于一个整数坐标值,合理的步长应给为 10n, 2·10n, 或者 5·10n。

首先我们计算最大步长(gross step),然后计算小于或者等于这个步长的 10n,通过计算这

个步长的以十为底的对数,然后计算这个值的 10 次方。例如,如果最大步长为 236,log (236)

为 2.37291…,四舍五入为 2,得到 102 = 100 作为候选的步长值。有了第一个值以后,我们再继续计算其他的候选值 2·10n 和 5·10n。如上例中,另外两个可能的值为 200 和 500。500 大于最大的步长值不能使用,200 小于 236,使用 200 作为步长的值。接着计算刻度数,min 和 max 就很容易了。新的 min 值为原来的min 值和步长乘积的较小整数值,新的max 为原来的max 值和步长乘积的较大整数值。新的 numTicks 为新的min 和 max 的间隔数。例如,输入的min 值为 240,max 为 1184,新的值就会变成 200,1200, 200 为步长,就有numTicks 值为 5;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风逐流wrx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值