CGII/framework/include/libs/plot/plot1d.h
2018-05-17 16:01:02 +02:00

111 lines
4.6 KiB
C++

#pragma once
#include "plot_base.h"
#include <cgv/render/shader_program.h>
#include "lib_begin.h"
namespace cgv {
namespace plot {
/** extend common plot configuration with parameters specific to 1d plot */
struct CGV_API plot1d_config : public plot_base_config
{
bool show_lines;
float line_width;
Clr line_color;
plot1d_config();
};
/** The \c plot1d class draws 1d plots with potentially several sub plots of different plot configuration */
class CGV_API plot1d : public plot_base
{
cgv::render::shader_program prog;
cgv::render::shader_program stick_prog;
cgv::render::shader_program bar_prog, bar_outline_prog;
protected:
std::vector<std::vector<P2D> > samples;
B2D domain;
axis_config axes[2];
V2D extent;
V3D axis_directions[2];
P3D center_location;
P3D transform_to_world(const P2D& domain_point) const;
axis_config& ref_axis_config(unsigned ai);
void set_uniforms(cgv::render::context& ctx, cgv::render::shader_program& prog, unsigned i);
public:
/// construct empty plot with default domain [0..1,0..1]
plot1d();
/// return number of axis
unsigned get_nr_axes() const;
/// adjust the domain with respect to \c ai th axis to the data
void adjust_domain_axis_to_data(unsigned ai, bool adjust_min = true, bool adjust_max = true);
/// adjust the domain with respect to \c ai th axis to the data in the currently visible plots
void adjust_domain_axis_to_visible_data(unsigned ai, bool adjust_min = true, bool adjust_max = true);
/// adjust selected axes of domain to data
void adjust_domain_to_data(bool adjust_x_axis = true, bool adjust_y_axis = true);
/// adjust selected axes of domain to data in the currently visible plots
void adjust_domain_to_visible_data(bool adjust_x_axis = true, bool adjust_y_axis = true);
/// extend domain such that given axis is included
void include_axis_to_domain(unsigned ai);
/// adjust tick marks
void adjust_tick_marks_to_domain(unsigned max_nr_primary_ticks = 20);
/// return domain shown in plot
const B2D& get_domain() { return domain; }
/// reference domain shown in plot
B2D& ref_domain() { return domain; }
/// set the plot extend in 2D coordinates
void set_extent(const V2D& new_extent);
/// query the plot extend in 2D coordinates
const V2D& get_extent() const;
/// set the plot width to given value and if constrained == true the height, such that the aspect ration is the same as the aspect ratio of the domain
void set_width(Crd new_width, bool constrained = true);
/// set the plot height to given value and if constrained == true the width, such that the aspect ration is the same as the aspect ratio of the domain
void set_height(Crd new_height, bool constrained = true);
/// set the direction of x or y axis
void set_axis_direction(unsigned ai, const V3D& new_axis_direction);
/// place the origin of the plot in 3D to the given location
void place_origin(const P3D& new_origin_location);
/// place the plot extent center in 3D to the given location (this might can change the current origin location)
void place_center(const P3D& new_center_location);
/// place a corner (0 .. lower left, 1 .. lower right, 2 .. upper left, 3 .. upper right) to a given 3D location ((this might can change the current origin / center location)
void place_corner(unsigned corner_index, const P3D& new_corner_location);
/// return the current origin in 3D coordinates
P3D get_origin() const;
/// return the current plot center in 3D coordinates
const P3D& get_center() const;
/// return the i-th plot corner in 3D coordinates
P3D get_corner(unsigned i) const;
/// set the direction of x or y axis
const V3D& get_axis_direction(unsigned ai) const;
/**@name management of sub plots*/
//@{
/// add sub plot and return sub plot index
unsigned add_sub_plot(const std::string& name);
/// delete the i-th sub plot
void delete_sub_plot(unsigned i);
/// return a reference to the plot1d configuration of the i-th plot
plot1d_config& ref_sub_plot1d_config(unsigned i = 0);
/// set the colors for all plot features of the i-th sub plot as variation of the given color
void set_sub_plot_colors(unsigned i, const Clr& base_color);
/// return the samples of the i-th sub plot
std::vector<P2D>& ref_sub_plot_samples(unsigned i = 0);
//@}
/// create the gui for the plot independent of the sub plots
void create_plot_gui(cgv::base::base* bp, cgv::gui::provider& p);
/// create the gui for a configuration, overload to specialize for extended configs
void create_config_gui(cgv::base::base* bp, cgv::gui::provider& p, unsigned i);
bool init(cgv::render::context& ctx);
void draw(cgv::render::context& ctx);
void clear(cgv::render::context& ctx);
};
}
}
#include <cgv/config/lib_end.h>