Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
mandelbrot.C File Reference

Detailed Description

View in nbviewer Open in SWAN
Using TExec to handle keyboard events and TComplex to draw the Mandelbrot set.

Pressing the keys 'z' and 'u' will zoom and unzoom the picture near the mouse location, 'r' will reset to the default view.

Try it (in compiled mode!) with: root mandelbrot.C+

Details

when a mouse event occurs the myexec() function is called (by using AddExec). Depending on the pressed key, the mygenerate() function is called, with the proper arguments. Note the last_x and last_y variables that are used in myexec() to store the last pointer coordinates (px is not a pointer position in kKeyPress events).

#include <TStyle.h>
#include <TROOT.h>
#include <TH2.h>
#include <TComplex.h>
#include <TVirtualPad.h>
#include <TCanvas.h>
TH2F *last_histo = nullptr;
void mygenerate(double factor, double cen_x, double cen_y)
{
printf("Regenerating...\n");
// resize histo:
if (factor > 0) {
double dx = last_histo->GetXaxis()->GetXmax() - last_histo->GetXaxis()->GetXmin();
double dy = last_histo->GetYaxis()->GetXmax() - last_histo->GetYaxis()->GetXmin();
last_histo->SetBins(last_histo->GetNbinsX(), cen_x - factor * dx / 2, cen_x + factor * dx / 2,
last_histo->GetNbinsY(), cen_y - factor * dy / 2, cen_y + factor * dy / 2);
last_histo->Reset();
} else {
delete last_histo;
// allocate first view...
last_histo = new TH2F("h2", "Mandelbrot [move mouse and press z to zoom, u to unzoom, r to reset]", 200, -2, 2,
200, -2, 2);
last_histo->SetStats(false);
}
const int max_iter = 50;
for (int bx = 1; bx <= last_histo->GetNbinsX(); bx++)
for (int by = 1; by <= last_histo->GetNbinsY(); by++) {
double x = last_histo->GetXaxis()->GetBinCenter(bx);
double y = last_histo->GetYaxis()->GetBinCenter(by);
TComplex point(x, y);
TComplex z = point;
int iter = 0;
while (z.Rho() < 2) {
z = z * z + point;
last_histo->Fill(x, y);
iter++;
if (iter > max_iter)
break;
}
}
last_histo->SetContour(99);
last_histo->Draw("colz");
gPad->Modified();
gPad->Update();
printf("Done.\n");
}
void myexec()
{
// get event information
int event = gPad->GetEvent();
int px = gPad->GetEventX();
int py = gPad->GetEventY();
// some magic to get the coordinates...
double xd = gPad->AbsPixeltoX(px);
double yd = gPad->AbsPixeltoY(py);
float x = gPad->PadtoX(xd);
float y = gPad->PadtoY(yd);
static float last_x;
static float last_y;
if (event != kKeyPress) {
last_x = x;
last_y = y;
return;
}
const double Z = 2.;
switch (px) {
case 'z': // ZOOM
break;
case 'u': // UNZOOM
break;
case 'r': // RESET
break;
};
}
void mandelbrot()
{
// cosmetics...
new TCanvas("canvas", "View Mandelbrot set");
// this generates and draws the first view...
mygenerate(-1, 0, 0);
// add exec
gPad->AddExec("myexec", "myexec()");
}
@ kKeyPress
Definition Buttons.h:20
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
R__EXTERN TStyle * gStyle
Definition TStyle.h:436
#define gPad
The Canvas class.
Definition TCanvas.h:23
Double_t Rho() const
Definition TComplex.h:48
2-D histogram with a float per channel (see TH1 documentation)
Definition TH2.h:303
void SetPadGridX(Bool_t gridx)
Definition TStyle.h:362
void SetPadGridY(Bool_t gridy)
Definition TStyle.h:363
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Author
Luigi Bardelli barde.nosp@m.lli@.nosp@m.fi.in.nosp@m.fn.i.nosp@m.t

Definition in file mandelbrot.C.