Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 35

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

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.