]>
git.mar77i.info Git - bigintmandel/blob - mandel.cpp
9 MpzPoint::MpzPoint() : x(), y() {}
10 MpzPoint::MpzPoint(mpz_class x
, mpz_class y
) : x(x
), y(y
) {}
11 MpzPoint::MpzPoint(const MpzPoint
&other
) : x(other
.x
), y(other
.y
) {}
13 MandelResultCell::MandelResultCell() {}
15 MandelResultCell::MandelResultCell(size_t iter
, MpzPoint rpos
)
16 : iter(iter
), rpos(rpos
) {}
18 static inline void incrpos(QPoint
&pos
, const int width
) {
19 pos
.setX(pos
.x() + 1);
20 if (pos
.x() == width
) {
22 pos
.setY(pos
.y() + 1);
26 static inline mpz_class
get_one(const QSize size
) {
27 int one
= std::min(size
.width() / 3, size
.height() / 3) / 2;
34 return mpz_class(one
+ 1);
37 MandelMeta::MandelMeta(size_t max_iter
, const QSize size
)
39 img(size
, QImage::Format_RGB888
),
40 cells(size
.width() * size
.height(), MandelCell(this)),
43 QVector
<MandelCell
>::iterator i
;
44 QPointF
c(size
.width() / 2., size
.height() / 2.);
47 center_f
= MpzPoint(one
* -3 / 4, 0);
48 for (i
= cells
.begin(); i
!= cells
.end(); incrpos(pos
, size
.width()), i
++) {
54 void MandelMeta::zoom2x(QPoint pos
) {
55 QVector
<MandelCell
>::iterator i
;
56 MpzPoint p
= cells
[img
.width() * pos
.y() + pos
.x()].get_rpos0();
57 center_f
= MpzPoint(p
.get_x() * 8, p
.get_y() * 8);
59 img
.fill(Qt::GlobalColor::black
);
60 for (i
= cells
.begin(); i
!= cells
.end(); i
++)
61 i
->reset_iter_and_rpos();
64 void MandelMeta::finished_cell(int num
, const MandelResultCell
&cell
) {
66 cells
[num
].update_result(cell
.iter
, cell
.rpos
),
68 ? colors
[cell
.iter
% colors
.size()]
69 : Qt::GlobalColor::black
73 MandelResultCell
MandelMeta::iterate(const MandelCell
&cell
) {
74 return cell
.iterate();
77 void MandelCell::reset_rpos0() {
78 MpzPoint center_f
= meta
->get_center_f();
80 center_f
.get_x() + (pos
.x() - meta
->get_width() / 2.),
81 center_f
.get_y() + (pos
.y() - meta
->get_height() / 2.)
85 MandelCell::MandelCell(MandelMeta
*meta
) : meta(meta
), iter(0) {}
87 MandelCell::MandelCell(const MandelCell
&cell
)
88 : meta(cell
.meta
), pos(cell
.pos
), iter(cell
.iter
),
89 rpos(cell
.rpos
), rpos0(cell
.rpos0
) {}
91 QPoint
MandelCell::update_result(size_t iter
, const MpzPoint
&rpos
) {
97 void MandelCell::reset_iter_and_rpos() {
103 void MandelCell::set_meta(MandelMeta
*meta
) {
107 void MandelCell::set_pos(QPoint pos
) {
112 MandelResultCell
MandelCell::iterate() const {
113 MpzPoint rpos
= this->rpos
, sq
;
114 mpz_class one
= meta
->get_one(), four
= one
* one
* 4;
116 size_t iter
= this->iter
;
117 for (; iter
< meta
->get_max_iter(); iter
++) {
118 sqx
= rpos
.get_x() * rpos
.get_x();
119 sqy
= rpos
.get_y() * rpos
.get_y();
120 if (sqx
+ sqy
> four
)
123 (sqx
- sqy
) / one
+ rpos0
.get_x(),
124 rpos
.get_x() * rpos
.get_y() * 2 / one
+ rpos0
.get_y()
127 return MandelResultCell(iter
, rpos
);