]>
git.mar77i.info Git - bigintmandel/blob - mandel.cpp
5 * This file is covered by the LICENSE file in the root of this project.
10 #include <QJsonDocument>
15 static inline const MpzPoint
calculate_offset(
16 const MpzPoint center_f
, const QSize size
19 center_f
.get_x() - size
.width() / 2,
20 center_f
.get_y() + size
.height() / 2
24 MandelParams::MandelParams() {}
25 MandelParams::MandelParams(
30 ) : max_iter(max_iter
),
33 offset(calculate_offset(center_f
, size
)),
35 MandelParams::MandelParams(const MandelParams
&other
)
36 : max_iter(other
.max_iter
),
38 center_f(other
.center_f
),
39 offset(calculate_offset(other
.center_f
, other
.size
)),
42 void MandelParams::set_size(const QSize
&size
) {
44 this->offset
= calculate_offset(center_f
, size
);
47 MandelParams
MandelParams::from_json(const QJsonObject
&json
) {
49 json
["max_iter"].toString().toULongLong(),
50 QSize(json
["size_w"].toInt(), json
["size_h"].toInt()),
52 mpz_class(json
["center_f_x"].toString().toStdString()),
53 mpz_class(json
["center_f_y"].toString().toStdString())
55 mpz_class(json
["one"].toString().toStdString())
59 QJsonObject
MandelParams::to_json() const {
61 json
["max_iter"] = QString::number(max_iter
);
62 json
["size_w"] = size
.width();
63 json
["size_h"] = size
.height();
64 json
["center_f_x"] = QString::fromStdString(center_f
.get_x().get_str());
65 json
["center_f_y"] = QString::fromStdString(center_f
.get_y().get_str());
66 json
["one"] = QString::fromStdString(one
.get_str());
70 static inline void incrpos(QPoint
&pos
, const int width
) {
71 pos
.setX(pos
.x() + 1);
72 if (pos
.x() == width
) {
74 pos
.setY(pos
.y() + 1);
78 static inline void setup_cells(
79 QVector
<MandelCell
> &cells
, const MandelParams
*current
81 QSize size
= current
->get_size();
82 QVector
<MandelCell
>::iterator i
;
85 cells
.resize(size
.width() * size
.height(), MandelCell(current
));
86 for (i
= cells
.begin(); i
!= cells
.end(); incrpos(pos
, size
.width()), i
++)
90 static inline QImage
*setup_image(QImage
*img
, const QSize
&size
) {
91 if(!img
|| img
->size() != size
) {
93 img
= new QImage(size
, QImage::Format_RGB888
);
95 img
->fill(Qt::GlobalColor::black
);
99 MandelSettings::MandelSettings(quint64 max_iter
, const QSize size
)
101 reset(max_iter
, size
);
104 void MandelSettings::clear() {
105 img
= setup_image(img
, params
.get_size());
106 img
->fill(Qt::GlobalColor::black
);
107 setup_cells(cells
, ¶ms
);
110 void MandelSettings::zoom(const QSize size
, int zoom_factor
, const QPoint pos
) {
111 MpzPoint p
= cells
[img
->width() * pos
.y() + pos
.x()].get_rpos0();
112 params
= MandelParams(
113 params
.get_max_iter(),
115 MpzPoint(p
.get_x() * zoom_factor
, p
.get_y() * zoom_factor
),
116 params
.get_one() * zoom_factor
121 void MandelSettings::finished_cell(int num
, const MandelResultCell
&result
) {
122 cells
[num
].set_result(result
);
125 img
->setPixelColor(cells
[num
].get_pos(), cells
[num
].get_color());
130 void MandelSettings::save_img(QString file_name
) {
132 img
->save(file_name
);
135 void MandelSettings::reset(quint64 max_iter
, const QSize size
) {
138 int ione
= std::min(size
.width(), size
.height()) / 3;
145 one
= mpz_class(ione
+ 1);
146 center_f
= MpzPoint(one
* -3 / 4, 0);
147 params
= MandelParams(max_iter
, size
, center_f
, one
);
151 void MandelSettings::from_json(const QJsonObject
&json
) {
152 QJsonArray json_array
;
154 params
= MandelParams::from_json(json
["params"].toObject());
155 json_array
= json
["cells"].toArray();
156 cells
.resize(json_array
.size(), MandelCell(¶ms
));
157 img
= setup_image(img
, params
.get_size());
158 for (i
= 0; i
< json_array
.size(); i
++)
159 finished_cell(i
, cells
[i
].from_json(json_array
[i
].toObject()));
162 QJsonObject
MandelSettings::to_json() {
165 QVector
<MandelCell
>::iterator i
;
166 json
["params"] = params
.to_json();
167 for (i
= cells
.begin(); i
!= cells
.end(); i
++)
168 c
.append(i
->to_json());
173 MandelCell::MandelCell(const MandelParams
*params
) : params(params
) {}
174 MandelCell::MandelCell(const MandelCell
&cell
)
175 : params(cell
.params
),
180 void MandelCell::setup(const QPoint pos
) {
181 const MpzPoint
&offset
= params
->get_offset();
183 rpos0
= MpzPoint(offset
.get_x() + pos
.x(), offset
.get_y() - pos
.y());
184 result
= MandelResultCell();
187 MandelResultCell
MandelCell::iterate() const {
188 MpzPoint rpos
= result
.get_rpos(), sq
;
189 mpz_class one
= params
->get_one(), four
= one
* one
* 4;
191 quint64 iter
= result
.get_iter();
192 for (; iter
< params
->get_max_iter(); iter
++) {
193 sqx
= rpos
.get_x() * rpos
.get_x();
194 sqy
= rpos
.get_y() * rpos
.get_y();
195 if (sqx
+ sqy
> four
)
198 (sqx
- sqy
) / one
+ rpos0
.get_x(),
199 rpos
.get_x() * rpos
.get_y() * 2 / one
+ rpos0
.get_y()
202 return MandelResultCell(iter
, rpos
);
205 MandelResultCell
MandelCell::from_json(const QJsonObject
&json
) {
206 this->pos
= QPoint(json
["pos_x"].toInt(), json
["pos_y"].toInt());
207 this->rpos0
= MpzPoint(
208 mpz_class(json
["rpos0_x"].toString().toStdString()),
209 mpz_class(json
["rpos0_y"].toString().toStdString())
211 return MandelResultCell(
212 json
["iter"].toString().toULongLong(),
214 mpz_class(json
["rpos_x"].toString().toStdString()),
215 mpz_class(json
["rpos_y"].toString().toStdString())
220 QJsonObject
MandelCell::to_json() const {
221 const MpzPoint
rpos(result
.get_rpos());
223 json
["pos_x"] = pos
.x();
224 json
["pos_y"] = pos
.y();
225 json
["rpos0_x"] = QString::fromStdString(rpos0
.get_x().get_str());
226 json
["rpos0_y"] = QString::fromStdString(rpos0
.get_y().get_str());
227 json
["iter"] = QString::number(result
.get_iter());
228 json
["rpos_x"] = QString::fromStdString(rpos
.get_x().get_str());
229 json
["rpos_y"] = QString::fromStdString(rpos
.get_y().get_str());