int main(int argc, char *argv[]) { MTOOLS_SWAP_THREADS(argc, argv); parseCommandLine(argc, argv, true); cout << "**************************************\n"; cout << "Simulation of a 1D simple random walk.\n"; cout << "**************************************\n"; bool autorange = arg("auto").info("update the plotter's range automatically"); cout << "\nSimulating...\n"; MT2004_64 gen; // the RNG std::vector<int> tab; // the vector containing the positions int pos = 0; // current position Plotter2D P; // the plotter object auto PF1 = makePlot2DFun(f1); // the first function plot object auto PF2 = makePlot2DFun(f2); // the second function plot object auto PV = makePlot2DVector(tab); // the vector plot, use natural dynamically growing range. P[PV][PF1][PF2]; // insert everything in the plotter PV.interpolationLinear(); // use linear interpolation PV.hypograph(true); // fill the hypograph PV.hypographOpacity(0.3f); // but make it half transparent P.autoredraw(60); // the plotter window should redraw itself at least every second (more in fact since it redraws after unsuspending) P.range().fixedAspectRatio(false); // disable the fixed aspect ratio if (!autorange) P.range().setRange(fBox2(-1.0e7, 5.0e8, -60000, 60000)); // set the range (if not automatic adjustment) P.startPlot(); // display the plotter while (P.shown()) // loop until the plotter window is closed { while (tab.size() < tab.capacity()) { pos += ((Unif(gen) < 0.5) ? -1 : 1); tab.push_back(pos); } // fill the vector with new steps of the walk until its capacity() PV.suspend(true); // suspend access to PV while we reallocate the vector memory. tab.reserve(tab.capacity() + 1000000); // reserve more space PV.suspend(false); // resume access to the graph. if (autorange) P.autorangeXY(); // autorange (causes a redraw) } return 0; }
/* Plot the trace of the walk */ void plotWalk() const { Plotter2D Plotter; auto L = makePlot2DLattice(*this, std::string("OERRW-d") + mtools::toString(delta)); L.setImageType(L.TYPEIMAGE); Plotter[L]; Plotter.gridObject(true)->setUnitCells(); Plotter.range().setRange(zoomOut(fBox2(R))); Plotter.plot(); }
int main(int argc, char *argv[]) { MTOOLS_SWAP_THREADS(argc, argv); // required on OSX, does nothing on Linux/Windows RGBc RR = RGBc::c_Red.getMultOpacity(0.5); RGBc GG = RGBc::c_Green.getMultOpacity(0.5); RGBc BB = RGBc::c_Blue.getMultOpacity(0.5); RGBc FF = RGBc::c_Yellow.getMultOpacity(0.5f); int64 L = 50; TestImage im(L, L); im.clear(RGBc(240,240,240)); using namespace internals_bseg; fVec2 P1(10,10); fVec2 P2(37.49,25.49); fVec2 P3(13,20.99); im._bseg_draw(BSeg(P1, P2), true, RR); im._bseg_avoid1(BSeg(P1, P3), true, BSeg(P1, P2), true, GG); im._bseg_avoid11(BSeg(P2, P3), BSeg(P2, P1), true, BSeg(P3, P1), true, BB); im._bseg_fill_triangle(P1, P2, P3, FF); /* im.blendPixel({ 40, 9 }, BB); im.blendPixel({ 10, 9 }, BB); im.blendPixel({ 20, 9 }, BB); im.blendPixel({ 30, 9 }, BB); */ Plotter2D plotter; auto P = makePlot2DImage(im); plotter[P]; plotter.range().setRange(fBox2{ -0.5, L - 0.5, -0.5, L - 0.5}); plotter.gridObject(true); plotter.gridObject()->setUnitCells(); plotter.plot(); return 0; }
/* run the simulation */ void run() { cout << "\nSimulating : zoom in to view the details of the tree structure...\n"; auto P = makePlot2DLattice(EC, "Tree Eden model"); P.opacity(0.5); P.setImageType(P.TYPEIMAGE); Plotter2D Plotter; Plotter[P]; Plotter.startPlot(); Plotter.range().setRange(unionRect(mtools::zoomOut(EC.range()), fBox2(-5000, 5000, -5000, 5000))); Plotter.autoredraw(600); cout << EC.toString(); watch("Cluster size", EC, printSize); while (Plotter.shown()) { if (EC.size() % 10000000 == 0) cout << EC.toString(); EC.simulate(1000000); } watch.remove("Cluster size"); return; }