]>
git.mar77i.info Git - bigintmandel/blob - mandel.cpp
7 MandelResultCell::MandelResultCell() {}
9 MandelResultCell::MandelResultCell(size_t iter
, QPointF rpos
)
10 : iter(iter
), rpos(rpos
) {}
12 static inline void incrpos(QPoint
&pos
, const int width
) {
13 pos
.setX(pos
.x() + 1);
14 if (pos
.x() == width
) {
16 pos
.setY(pos
.y() + 1);
20 MandelMeta::MandelMeta(size_t max_iter
, const QSize size
)
22 img(size
, QImage::Format_RGB888
),
23 cells(size
.width() * size
.height(), MandelCell(this)),
24 center_f(qreal(-3) / 4, 0),
27 scale(std::max(qreal(3) / size
.width(), qreal(3) / size
.height()))
29 QVector
<MandelCell
>::iterator i
;
30 QPointF
c(size
.width() / 2., size
.height() / 2.);
33 for (i
= cells
.begin(); i
!= cells
.end(); incrpos(pos
, size
.width()), i
++) {
39 void MandelMeta::zoom2x(QPoint pos
) {
40 QVector
<MandelCell
>::iterator i
;
41 center_f
= cells
[img
.width() * pos
.y() + pos
.x()].get_rpos0();
43 img
.fill(Qt::GlobalColor::black
);
44 for (i
= cells
.begin(); i
!= cells
.end(); i
++)
45 i
->reset_iter_and_rpos();
48 void MandelMeta::finished_cell(int num
, const MandelResultCell
&cell
) {
50 cells
[num
].update_result(cell
.iter
, cell
.rpos
),
52 ? colors
[cell
.iter
% colors
.size()]
53 : Qt::GlobalColor::black
57 MandelResultCell
MandelMeta::iterate(const MandelCell
&cell
) {
58 return cell
.iterate();
61 void MandelCell::reset_rpos0() {
62 QPointF center_f
= meta
->get_center_f();
64 center_f
.x() + (pos
.x() - meta
->get_width() / 2.) * meta
->get_scale(),
65 center_f
.y() + (pos
.y() - meta
->get_height() / 2.) * meta
->get_scale()
69 MandelCell::MandelCell(MandelMeta
*meta
) : meta(meta
), iter(0) {}
71 MandelCell::MandelCell(const MandelCell
&cell
)
72 : meta(cell
.meta
), pos(cell
.pos
), iter(cell
.iter
),
73 rpos(cell
.rpos
), rpos0(cell
.rpos0
) {}
75 QPoint
MandelCell::update_result(size_t iter
, const QPointF
&rpos
) {
81 void MandelCell::reset_iter_and_rpos() {
87 void MandelCell::set_meta(MandelMeta
*meta
) {
91 void MandelCell::set_pos(QPoint pos
) {
96 MandelResultCell
MandelCell::iterate() const {
97 size_t iter
= this->iter
;
98 QPointF rpos
= this->rpos
, sq
;
99 for (; iter
< this->meta
->get_max_iter(); iter
++) {
100 sq
= QPointF(rpos
.x() * rpos
.x(), rpos
.y() * rpos
.y());
101 if (sq
.x() + sq
.y() > meta
->get_four())
104 sq
.x() - sq
.y() + rpos0
.x(),
105 2 * rpos
.x() * rpos
.y() + rpos0
.y()
108 return MandelResultCell(iter
, rpos
);