Esempio n. 1
0
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 );
    }
}
Esempio n. 2
0
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();
}