189 void Plotter::refreshPixmap()
190 {
191 pixmap = QPixmap(size());
192 pixmap.fill(this, 0, 0);
193 QPainter painter(&pixmap);
194 painter.initFrom(this);
195 drawGrid(&painter);
196 drawCurves(&painter);
197 update();
198 }
Π€ΡΠ½ΠΊΡΠΈΡ refreshPixmap() ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°Π΅Ρ Π³ΡΠ°ΡΠΈΠΊ Π½Π° Π²Π½Π΅ΡΠΊΡΠ°Π½Π½ΠΎΠΉ ΠΏΠΈΠΊΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠ°ΡΡΠ΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡΠ°Π½Π΅. ΠΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΏΠΈΠΊΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠ°ΡΡΡ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π΅Π΅ ΡΠ²Π΅ΡΠΎΠΌ ΡΡΠ΅ΡΡΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ°. ΠΡΠΎΡ ΡΠ²Π΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Β«ΡΠ΅ΠΌΠ½ΡΠΌΒ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΠΏΠ°Π»ΠΈΡΡΡ ΠΈΠ·-Π·Π° Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ setBackgroundRole() Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ Plotter. ΠΡΠ»ΠΈ ΡΠΎΠ½ Π·Π°Π΄Π°Π΅ΡΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΡΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΈΡΡΡΡ, Π² ΡΡΠ½ΠΊΡΠΈΠΈ QPixmap::fill() Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄ΠΆΠ΅ΡΠ΅, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΡΡ ΠΏΠΈΠΊΡΠ΅Π»ΡΠ½Π°Ρ ΠΊΠ°ΡΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π²ΡΡΠ°Π²Π½ΠΈΡΡ ΠΎΠ±ΡΠ°Π·Π΅Ρ ΠΊΠΈΡΡΠΈ. ΠΠ΄Π΅ΡΡ ΠΏΠΈΠΊΡΠ΅Π»ΡΠ½Π°Ρ ΠΊΠ°ΡΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π²ΡΠ΅ΠΌΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ (0, 0).
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ QPainter Π΄Π»Ρ Π²ΡΡΠ΅ΡΡΠΈΠ²Π°Π½ΠΈΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠ°ΡΡΠ΅. ΠΡΠ·ΠΎΠ² initFrom() ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π² ΡΠΈΡΠΎΠ²Π°Π»ΡΡΠΈΠΊΠ΅ ΠΏΠ΅ΡΠΎ, ΡΠΎΠ½ ΠΈ ΡΡΠΈΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Π»Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Plotter. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ drawGrid() ΠΈ drawCurves(), ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΡΡΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ update() Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ°. ΠΠΈΠΊΡΠ΅Π»ΡΠ½Π°Ρ ΠΊΠ°ΡΡΠ° ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ paintEvent().
199 void Plotter::drawGrid(QPainter *painter)
200 {
201 QRect rect(Margin, Margin,
202 width() - 2 * Margin, height() - 2 * Margin);
203 if (!rect.isValid())
204 return;
205 PlotSettings settings = zoomStack[curZoom];
206 QPen quiteDark = palette().dark().color().light();
207 QPen light = palette().light().color();
208 for (int i = 0; i <= settings.numXTicks; ++i) {
209 int x = rect.left() + (i * (rect.width() - 1)
210 / settings.numXTicks);
211 double label = settings.minX + (i * settings.spanX()
212 / settings.numXTicks);
213 painter->setPen(quiteDark);
214 painter->drawLine(x, rect.top(), x, rect.bottom());
215 painter->setPen(light);
216 painter->drawLine(x, rect.bottom(), x, rect.bottom() + 5);
217 painter->drawText(x - 50, rect.bottom() + 5, 100, 15,
218 Qt::AlignHCenter | Qt::AlignTop,
219 QString::number(label));
220 }
221 for (int j = 0; j <= settings.numVTicks; ++j) {
222 int y = rect.bottom() - (j * (rect.height() - 1)
223 / settings.numYTicks);
224 double label = settings.minY + (j * settings.spanY()
225 / settings.numYTicks);
226 painter->setPen(quiteDark);
227 painter->drawLine(rect.left(), Ρ, rect.right(), Ρ);
228 painter->setPen(light);
229 painter->drawLine(rect.left() - 5, y, rect.left(), Ρ);
230 painter->drawText(rect.left() - Margin, Ρ - 10, Margin - 5, 20,
231 Qt::AlignRight | Qt::AlignVCenter,
232 QString::number(label));
233 }
234 painter->drawRect(rect.adjusted(0, 0, -1, -1));
235 }
Π€ΡΠ½ΠΊΡΠΈΡ drawGrid() ΡΠ΅ΡΡΠΈΡ ΡΠ΅ΡΠΊΡ ΠΏΠΎΠ΄ ΠΊΡΠΈΠ²ΡΠΌΠΈ ΠΈ ΠΎΡΡΠΌΠΈ. ΠΠ±Π»Π°ΡΡΡ Π΄Π»Ρ Π²ΡΡΠ΅ΡΡΠΈΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠΊΠΈ Π·Π°Π΄Π°Π΅ΡΡΡ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠΌ rect. ΠΡΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½Ρ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΠΊΠ°, ΠΌΡ ΡΡΠ°Π·Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
ΠΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΊΠ» for ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠΈ ΠΏΠΎ ΠΎΡΠΈ x. ΠΡΠΎΡΠΎΠΉ ΡΠΈΠΊΠ» for Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ ΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠΈ ΠΏΠΎ ΠΎΡΠΈ y. Π ΠΊΠΎΠ½ΡΠ΅ ΠΌΡ ΡΠΈΡΡΠ΅ΠΌ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΠΏΠΎ ΠΎΠΊΠ°ΠΉΠΌΠ»ΡΡΡΠ΅ΠΉ ΠΊΡΠΎΠΌΠΊΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ drawText() ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΈΡΠ»ΠΎΠ²ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΎΡΠΌΠ΅ΡΠΎΠΊ ΠΎΠ±Π΅ΠΈΠ· ΠΎΡΠ΅ΠΉ.
ΠΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ drawText() ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΎΡΠΌΠ°Ρ:
painter.drawText(x, Ρ, ΡΠΈΡΠΈΠ½Π°, Π²ΡΡΠΎΡΠ°, ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΠ΅ΠΊΡΡ);
Π³Π΄Π΅ (x, Ρ, ΡΠΈΡΠΈΠ½Π°, Π²ΡΡΠΎΡΠ°) ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ, ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π΅Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠ΅ΠΊΡΡΠ° Π² ΡΡΠΎΠΌ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ΅ ΠΈ ΡΠ΅ΠΊΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΠ΅ΠΊΡΡ.
236 void Plotter::drawCurves(QPainter *painter)
237 {
238 static const QColor colorForIds[6] = {
239 Qt::red, Qt::green, Qt::blue, Qt::cyan, Qt::magenta, Qt::yellow };
240 PlotSettings settings = zoomStack[curZoom];
241 QRect rect(Margin, Margin,
242 width() - 2 * Margin, height() - 2 * Margin);
243 if (!rect.isValid())
244 return;
245 painter->setClipRect(rect.adjusted(+1, +1, -1, -1));
246 QMapIterator<int, QVector<QPointF> > i(curveMap);
247 while (i.hasNext()) {
248 i.next();
249 int id = i.key();
250 const QVector<QPointF> &data = i.value();
251 QPolygonF polyline(data.count());
252 for (int j = 0; j < data.count(); ++j) {
253 double dx = data[j].x() - settings.minX;
254 double dy = data[j].y() - settings.minY;
255 double x = rect.left() + (dx * (rect.width() - 1)
256 / settings.spanX());
257 double Ρ = rect.bottom() - (dy * (rect.height() - 1)
258 / settings.spanY());
259 polyline[j] = QPointF(x, Ρ);
260 }
261 painter->setPen(colorForIds[uint(id) % 6]);
262 painter->drawPolyline(polyline);
263 }
264 }
Π€ΡΠ½ΠΊΡΠΈΡ drawCurves() ΡΠΈΡΡΠ΅Ρ ΠΊΡΠΈΠ²ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΡ ΡΠ΅ΡΠΊΠΈ. ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ setClipRect Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ QPainter ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌ ΠΊΡΠΈΠ²ΡΠ΅ (Π±Π΅Π· ΠΎΠΊΠ°ΠΉΠΌΠ»ΡΡΡΠ΅ΠΉ ΠΊΡΠΎΠΌΠΊΠΈ ΠΈ ΡΠ°ΠΌΠΊΠΈ Π²ΠΎΠΊΡΡΠ³ Π³ΡΠ°ΡΠΈΠΊΠ°). ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ QPainter Π±ΡΠ΄Π΅Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ²ΠΎΠ΄ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Π²Π½Π΅ ΡΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠΈΠΊΠ» ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΊΡΠΈΠ²ΡΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ Π² ΡΡΠΈΠ»Π΅ Java, ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠΈΠΊΠ» ΠΏΠΎ Π΅Π΅ ΡΠΎΡΠΊΠ°ΠΌ QPointF. Π€ΡΠ½ΠΊΡΠΈΡ key() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΊΡΠΈΠ²ΠΎΠΉ, Π° ΡΡΠ½ΠΊΡΠΈΡ value() β Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ Π² Π²ΠΈΠ΄Π΅ Π²Π΅ΠΊΡΠΎΡΠ° QVector<QPointF>. ΠΠ½ΡΡΡΠΈ ΡΠΈΠΊΠ»Π° for ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠΎΡΠ΅ΠΊ QPointF ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΠΏΠΎΡΡΡΠΎΠΈΡΠ΅Π»Ρ Π³ΡΠ°ΡΠΈΠΊΠ° Π² ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ polyline.
ΠΠΎΡΠ»Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠΎΡΠ΅ΠΊ ΠΊΡΠΈΠ²ΠΎΠΉ Π² ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ²Π΅Ρ ΠΏΠ΅ΡΠ° Π΄Π»Ρ ΠΊΡΠΈΠ²ΠΎΠΉ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°Π±ΠΎΡΠΎΠ² Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ²Π΅ΡΠΎΠ²) ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ drawPolyline() Π΄Π»Ρ Π²ΡΡΠ΅ΡΡΠΈΠ²Π°Π½ΠΈΡ Π»ΠΈΠ½ΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠΎΡΠΊΠ°ΠΌ ΠΊΡΠΈΠ²ΠΎΠΉ.
ΠΡΠΈΠΌ ΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Plotter. ΠΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π³ΡΠ°ΡΠΈΠΊΠ° PlotSettings.
265 PlotSettings::PlotSettings()
266 {
267 minX = 0.0;
268 maxX = 10.0;
269 numXTicks = 5;
270 minY = 0.0;
271 maxY = 10.0;
272 numYTicks = 5;
273 }
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ PlotSettings ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎΠ±Π΅ ΠΎΡΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ ΠΎΡ 0 Π΄ΠΎ 10 Ρ ΠΏΡΡΡΡ ΠΎΡΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ.
274 void PlotSettings::scroll(int dx, int dy)
275 {
276 double stepX = spanX() / numXTicks;
277 minX += dx * stepX;
278 maxX += dx * stepX;
279 double stepY = spanY() / numYTicks;
280 minY += dy * stepY;
281 maxY += dy *stepY;
282 }
Π€ΡΠ½ΠΊΡΠΈΡ scroll() ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ (ΠΈΠ»ΠΈ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ) minX, maxX, minY ΠΈ maxY Π½Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΡ ΠΎΡΠΌΠ΅ΡΠΎΠΊ, ΠΏΠΎΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ. ΠΠ°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΡΠΎΠ»Π»ΠΈΠ½Π³Π° Π² ΡΡΠ½ΠΊΡΠΈΠΈ Plotter::keyPressEvent().
283 void PlotSettings::adjust()
284 {
285 adjustAxis(minX, maxX, numXTicks);
286 adjustAxis(minY, maxY, numYTicks);
287 }
Π€ΡΠ½ΠΊΡΠΈΡ adjust() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· mouseReleaseEvent() Π΄Π»Ρ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ minX, maxX, minY ΠΈ maxY, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Β«ΡΠ΄ΠΎΠ±Π½ΡΠ΅Β» Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΌΠ΅ΡΠΎΠΊ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡΠΈ. ΠΠ°ΠΊΡΡΡΠ°Ρ ΡyΠ½ΠΊΡΠΈΡ adjustAxis() Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡΠΈ.
288 void PlotSettings::adjustAxis(double &min, double &max, int &numTiΡks)
289 {
290 const int MinTicks = 4;
291 double grossStep = (max - min) / MinTicks;
292 double step = pow(10.0, floor(log10(grossStep)));
293 if (5 * step < grossStep) {
294 step *= 5;
295 } else if (2* step < grossStep) {
296 step *= 2;
297 }
298 numTicks = int (ceil(max / step) - floor(min / step));
299 if (numTicks < MinTicks)
300 numTicks = MinTicks;
301 min = floor(min / step) * step;
302 max = ceil(max / step) * step;
303 }
Π€ΡΠ½ΠΊΡΠΈΡ adjustAxis() ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ²ΠΎΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ min ΠΈ max Π² Β«ΡΠ΄ΠΎΠ±Π½ΡΠ΅Β» ΡΠΈΡΠ»Π° ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ²ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ numTicks Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠ΅ΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΠΎΠ΅, ΠΏΠΎ Π΅Π΅ ΡΠ°ΡΡΠ΅ΡΡ, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° [min, max]. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ adjustAxis() ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ (minX, maxX, numXTicks ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅), Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ , Π΄Π»Ρ ΡΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ const. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² adjustAxis() ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° ΠΏΡΠΎΡΡΠΎ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ step β ΡΠ°Π³). ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠΈ ΡΠ΄ΠΎΠ±Π½ΡΡ ΡΠΈΡΠ΅Π» ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½ΡΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΡΡΠΎΡ ΡΠ°Π³. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π³Π° 3.8 ΠΏΡΠΈΠ²Π΅Π»ΠΎ Π±Ρ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π½Π° ΠΎΡΠΈ ΡΠΈΡΠ΅Π», ΠΊΡΠ°ΡΠ½ΡΡ 3.8, ΡΡΠΎ Π·Π°ΡΡΡΠ΄Π½ΡΠ΅Ρ Π²ΠΎΡΠΏΡΠΈΡΡΠΈΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ. ΠΠ»Ρ ΠΎΡΠ΅ΠΉ Ρ Π΄Π΅ΡΡΡΠΈΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Β«ΡΠ΄ΠΎΠ±Π½ΡΠΌΠΈΒ» Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ°Π³Π° ΡΠ²Π»ΡΡΡΡΡ ΡΠΈΡΠ»Π° Π²ΠΈΠ΄Π° 10n, 2 β’ 10n ΠΈΠ»ΠΈ 5 β’ 10n.