void ParticleGraph::plot( cairo_t *cairo, const Coordmapper *cm, const double range[4] ) { // No plotting if( _particle_div == 0 ) return; // Q/M discriminator set std::vector<double> qm_set; if( !_qm_discr ) cairo_set_source_rgb( cairo, _color[0][0], _color[0][1], _color[0][2] ); cairo_set_line_width( cairo, 1.0 ); // Set clipping ranges double clip[4]; cm->transform( &clip[0], &range[0] ); cm->transform( &clip[2], &range[2] ); LineClip lc( cairo ); lc.set( clip[0], clip[1], clip[2], clip[3] ); // Loop through all particles for( size_t a = _particle_offset; a < _pdb.size(); a += _particle_div ) { // No plotting if one or less trajectory points if( _pdb.traj_size( a ) <= 1 ) continue; // Select color for particle if( _qm_discr ) { size_t c; const ParticleBase &p = _pdb.particle(a); for( c = 0; c < qm_set.size(); c++ ) { volatile double pqm = p.qm(); if( pqm == qm_set[c] ) break; } if( c == qm_set.size() ) qm_set.push_back( p.qm() ); // New q/m // Set color size_t s = c%_color.size(); cairo_set_source_rgb( cairo, _color[s][0], _color[s][1], _color[s][2] ); } // Loop through all particle trajectory points for( size_t b = 0; b < _pdb.traj_size( a ); b++ ) { double t; Vec3D loc, vel; _pdb.trajectory_point( t, loc, vel, a, b ); double x[5] = { loc(_vb[0]), loc(_vb[1]), vel(_vb[0]), vel(_vb[1]), t }; if( _pdb.get_polyint() ) draw_curve( cm, lc, x, b == 0 ); else draw_linear( cm, lc, x, b == 0 ); } cairo_stroke( cairo ); } }
void disp(void) { glClear(GL_COLOR_BUFFER_BIT); draw_points(); if(show_linear) draw_linear(); if(show_catmull_rom) draw_catmull_rom(); if(show_bezier) draw_bezier(); glutSwapBuffers(); }