Advertisement
Guest User

Mandelbrot slot-signal

a guest
Mar 20th, 2013
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.84 KB | None | 0 0
  1. frakablak.h:
  2.  
  3. #ifndef FRAKABLAK_H
  4. #define FRAKABLAK_H
  5.  
  6. #include <QtGui/QMainWindow>
  7. #include <QImage>
  8. #include <QPainter>
  9. #include "frakszal.h"
  10.  
  11. class FrakSzal;
  12.  
  13. class FrakAblak : public QMainWindow
  14. {
  15.     Q_OBJECT
  16.  
  17. public:
  18.     FrakAblak(double a = -2.0, double b = .7, double c = -1.35,
  19.               double d = 1.35, int szelesseg = 600,
  20.               int iteraciosHatar = 255, QWidget *parent = 0);
  21.     ~FrakAblak();
  22. public slots:
  23.     void vissza(int magassag , int * sor, int meret);
  24.  
  25. protected:
  26.     void paintEvent(QPaintEvent*);
  27.  
  28. private:
  29.     QImage* fraktal;
  30.     FrakSzal* mandelbrot;
  31.  
  32. };
  33.  
  34. #endif // FRAKABLAK_H
  35.  
  36. frakszal.h:
  37.  
  38. #ifndef FRAKSZAL_H
  39. #define FRAKSZAL_H
  40.  
  41. #include <QThread>
  42. #include <QImage>
  43. #include "frakablak.h"
  44.  
  45. class FrakAblak;
  46.  
  47. class FrakSzal : public QThread
  48. {
  49.     Q_OBJECT
  50.  
  51. public:
  52.     FrakSzal(double a, double b, double c, double d,
  53.              int szelesseg, int magassag, int iteraciosHatar, FrakAblak *frakAblak);
  54.     ~FrakSzal();
  55.     void run();
  56.  
  57. signals:
  58.     void ujsor(int magassag, int* sor, int szelesseg);
  59.  
  60. protected:
  61.     // A komplex sík vizsgált tartománya [a,b]x[c,d].
  62.     double a, b, c, d;
  63.     // A komplex sík vizsgált tartományára feszített
  64.     // háló szélessége és magassága.
  65.     int szelesseg, magassag;
  66.     // Max. hány lépésig vizsgáljuk a z_{n+1} = z_n * z_n + c iterációt?
  67.     // (tk. most a nagyítási pontosság)
  68.     int iteraciosHatar;
  69.  
  70.     FrakAblak* frakAblak;
  71.     int* egySor;
  72.  
  73. };
  74.  
  75. #endif // FRAKSZAL_H
  76.  
  77. frakablak.cpp:
  78.  
  79. // frakablak.cpp
  80. //
  81. // Mandelbrot halmaz rajzoló
  82. // Programozó Páternoszter
  83. //
  84. // Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
  85. //
  86. // This program is free software: you can redistribute it and/or modify
  87. // it under the terms of the GNU General Public License as published by
  88. // the Free Software Foundation, either version 3 of the License, or
  89. // (at your option) any later version.
  90. //
  91. // This program is distributed in the hope that it will be useful,
  92. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  93. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  94. // GNU General Public License for more details.
  95. //
  96. // You should have received a copy of the GNU General Public License
  97. // along with this program.  If not, see <http://www.gnu.org/licenses/>.
  98. //
  99. // Ez a program szabad szoftver; terjeszthetõ illetve módosítható a
  100. // Free Software Foundation által kiadott GNU General Public License
  101. // dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi
  102. // változata szerint.
  103. //
  104. // Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,
  105. // de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA
  106. // VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.
  107. // További részleteket a GNU General Public License tartalmaz.
  108. //
  109. // A felhasználónak a programmal együtt meg kell kapnia a GNU General
  110. // Public License egy példányát; ha mégsem kapta meg, akkor
  111. // tekintse meg a <http://www.gnu.org/licenses/> oldalon.
  112. //
  113. //
  114. // Version history:
  115. //
  116. // 0.0.1    Bár a Nokia Qt SDK éppen tartalmaz egy Mandelbrotos példát, de
  117. // ezt nem tartottam megfelelõnek elsõ Qt programként ajánlani, mert elég
  118. // bonyolult: használ kölcsönös kizárást stb. Ezért "from scratch" megírtam
  119. // egy sajátot a Javát tanítokhoz írt dallamára:
  120. // http://www.tankonyvtar.hu/informatika/javat-tanitok-2-2-080904-1
  121. //
  122.  
  123. #include "frakablak.h"
  124.  
  125. FrakAblak::FrakAblak(double a, double b, double c, double d,
  126.                      int szelesseg, int iteraciosHatar, QWidget *parent)
  127.                          : QMainWindow(parent)
  128. {
  129.     setWindowTitle("Mandelbrot halmaz");
  130.  
  131.     int magassag = (int)(szelesseg * ((d-c)/(b-a)));
  132.  
  133.     setFixedSize(QSize(szelesseg, magassag));
  134.     fraktal= new QImage(szelesseg, magassag, QImage::Format_RGB32);
  135.  
  136.     mandelbrot = new FrakSzal(a, b, c, d, szelesseg, magassag, iteraciosHatar, this);
  137.     mandelbrot->start();
  138.  
  139. }
  140.  
  141. FrakAblak::~FrakAblak()
  142. {
  143.     delete fraktal;
  144.     delete mandelbrot;
  145. }
  146.  
  147. void FrakAblak::paintEvent(QPaintEvent*) {
  148.     QPainter qpainter(this);
  149.     qpainter.drawImage(0, 0, *fraktal);
  150.     qpainter.end();
  151. }
  152.  
  153. void FrakAblak::vissza(int magassag, int *sor, int meret)
  154. {
  155.     for(int i=0; i<meret; ++i) {
  156.         QRgb szin = qRgb(0, 255-sor[i], 0);
  157.         fraktal->setPixel(i, magassag, szin);
  158.     }
  159.     update();
  160. }
  161.  
  162. frakszal.cpp:
  163.  
  164. // frakszal.cpp
  165. //
  166. // Mandelbrot halmaz rajzoló
  167. // Programozó Páternoszter
  168. //
  169. // Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
  170. //
  171. // This program is free software: you can redistribute it and/or modify
  172. // it under the terms of the GNU General Public License as published by
  173. // the Free Software Foundation, either version 3 of the License, or
  174. // (at your option) any later version.
  175. //
  176. // This program is distributed in the hope that it will be useful,
  177. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  178. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  179. // GNU General Public License for more details.
  180. //
  181. // You should have received a copy of the GNU General Public License
  182. // along with this program.  If not, see <http://www.gnu.org/licenses/>.
  183. //
  184. // Ez a program szabad szoftver; terjeszthetõ illetve módosítható a
  185. // Free Software Foundation által kiadott GNU General Public License
  186. // dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi
  187. // változata szerint.
  188. //
  189. // Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,
  190. // de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA
  191. // VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.
  192. // További részleteket a GNU General Public License tartalmaz.
  193. //
  194. // A felhasználónak a programmal együtt meg kell kapnia a GNU General
  195. // Public License egy példányát; ha mégsem kapta meg, akkor
  196. // tekintse meg a <http://www.gnu.org/licenses/> oldalon.
  197. //
  198. //
  199. // Version history:
  200. //
  201. // 0.0.1    Bár a Nokia Qt SDK éppen tartalmaz egy Mandelbrotos példát, de
  202. // ezt nem tartottam megfelelõnek elsõ Qt programként ajánlani, mert elég
  203. // bonyolult: használ kölcsönös kizárást stb. Ezért "from scratch" megírtam
  204. // egy sajátot a Javát tanítokhoz írt dallamára:
  205. // http://www.tankonyvtar.hu/informatika/javat-tanitok-2-2-080904-1
  206. //
  207.  
  208. #include "frakszal.h"
  209.  
  210.  
  211. FrakSzal::FrakSzal(double a, double b, double c, double d,
  212.                    int szelesseg, int magassag, int iteraciosHatar, FrakAblak *frakAblak)
  213. {
  214.     this->a = a;
  215.     this->b = b;
  216.     this->c = c;
  217.     this->d = d;
  218.     this->szelesseg = szelesseg;
  219.     this->iteraciosHatar = iteraciosHatar;
  220.     this->frakAblak = frakAblak;
  221.     this->magassag = magassag;
  222.     QObject::connect(this, SIGNAL(ujsor(int, int*, int)), frakAblak, SLOT(vissza(int, int*, int)));
  223.     egySor = new int[szelesseg];
  224. }
  225.  
  226. FrakSzal::~FrakSzal()
  227. {
  228.     delete[] egySor;
  229. }
  230.  
  231. // A szál kódját a Javát tanítokhoz írt Java kódomból vettem át
  232. // http://www.tankonyvtar.hu/informatika/javat-tanitok-2-2-080904-1
  233. // mivel itt az algoritmust is leírtam/lerajzoltam, így meghagytam
  234. // a kommenteket, hogy a hallgató könnyen hozzáolvashassa az "elméletet",
  235. // ha érdekli.
  236. void FrakSzal::run()
  237. {
  238.     // A [a,b]x[c,d] tartományon milyen sûrû a
  239.     // megadott szélesség, magasság háló:
  240.     double dx = (b-a)/szelesseg;
  241.     double dy = (d-c)/magassag;
  242.     double reC, imC, reZ, imZ, ujreZ, ujimZ;
  243.     // Hány iterációt csináltunk?
  244.     int iteracio = 0;
  245.     // Végigzongorázzuk a szélesség x magasság hálót:
  246.     for(int j=0; j<magassag; ++j) {
  247.         //sor = j;
  248.         for(int k=0; k<szelesseg; ++k) {
  249.             // c = (reC, imC) a háló rácspontjainak
  250.             // megfelelõ komplex szám
  251.             reC = a+k*dx;
  252.             imC = d-j*dy;
  253.             // z_0 = 0 = (reZ, imZ)
  254.             reZ = 0;
  255.             imZ = 0;
  256.             iteracio = 0;
  257.             // z_{n+1} = z_n * z_n + c iterációk
  258.             // számítása, amíg |z_n| < 2 vagy még
  259.             // nem értük el a 255 iterációt, ha
  260.             // viszont elértük, akkor úgy vesszük,
  261.             // hogy a kiinduláci c komplex számra
  262.             // az iteráció konvergens, azaz a c a
  263.             // Mandelbrot halmaz eleme
  264.             while(reZ*reZ + imZ*imZ < 4 && iteracio < iteraciosHatar) {
  265.                 // z_{n+1} = z_n * z_n + c
  266.                 ujreZ = reZ*reZ - imZ*imZ + reC;
  267.                 ujimZ = 2*reZ*imZ + imC;
  268.                 reZ = ujreZ;
  269.                 imZ = ujimZ;
  270.  
  271.                 ++iteracio;
  272.  
  273.             }
  274.             // ha a < 4 feltétel nem teljesült és a
  275.             // iteráció < iterációsHatár sérülésével lépett ki, azaz
  276.             // feltesszük a c-rõl, hogy itt a z_{n+1} = z_n * z_n + c
  277.             // sorozat konvergens, azaz iteráció = iterációsHatár
  278.             // ekkor az iteráció %= 256 egyenlõ 255, mert az esetleges
  279.             // nagyítasok során az iteráció = valahány * 256 + 255
  280.  
  281.             iteracio %= 256;
  282.  
  283.             //a színezést viszont már majd a FrakAblak osztályban lesz
  284.             egySor[k] = iteracio;
  285.         }
  286.         // Ábrázolásra átadjuk a kiszámolt sort a FrakAblak-nak.
  287.         usleep(10000);
  288.         emit ujsor(j, egySor, szelesseg);
  289.     }
  290. }
  291.  
  292. main.cpp:
  293.  
  294. // main.cpp
  295. //
  296. // Mandelbrot halmaz rajzoló
  297. // Programozó Páternoszter
  298. //
  299. // Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
  300. //
  301. // This program is free software: you can redistribute it and/or modify
  302. // it under the terms of the GNU General Public License as published by
  303. // the Free Software Foundation, either version 3 of the License, or
  304. // (at your option) any later version.
  305. //
  306. // Bár a Nokia Qt SDK éppen tartalmaz egy Mandelbrotos példát, de
  307. // ezt nem tartottam megfelelõnek elsõ Qt programként ajánlani, mert elég
  308. // bonyolult: használ kölcsönös kizárást stb. Ezért "from scratch" megírtam
  309. // egy sajátot a Javát tanítokhoz írt dallamára:
  310. // http://www.tankonyvtar.hu/informatika/javat-tanitok-2-2-080904-1
  311. //
  312.  
  313. #include <QtGui/QApplication>
  314. #include "frakablak.h"
  315.  
  316. int main(int argc, char *argv[])
  317. {
  318.     QApplication a(argc, argv);
  319.     // További adatokat olvashatsz le innen:
  320.     // http://www.tankonyvtar.hu/informatika/javat-tanitok-2-3-080904
  321.     FrakAblak w1,
  322.     w2(-.08292191725019529, -.082921917244591272,
  323.        -.9662079988595939, -.9662079988551173, 600, 3000),
  324.     w3(-.08292191724880625, -.0829219172470933,
  325.        -.9662079988581493, -.9662079988563615, 600, 4000),
  326.     w4(.14388310361318304, .14388310362702217,
  327.        .6523089200729396, .6523089200854384, 600, 38655);
  328.     w1.show();
  329.     w2.show();
  330.     w3.show();
  331.     w4.show();
  332.  
  333.     return a.exec();
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement