1#ifndef VERTEX_GEOMETRY_HPP
2#define VERTEX_GEOMETRY_HPP
27 : points(pts), triangulation_mode(mode) {
28 if (points.size() < 3)
29 throw std::runtime_error(
"Ngon must have at least 3 vertices");
33 NGon(std::size_t n_vertices,
float radius = 1.0f,
const glm::vec3 &normal = glm::vec3(0, 0, 1),
35 : triangulation_mode(mode) {
37 throw std::runtime_error(
"Ngon must have at least 3 vertices");
39 points.resize(n_vertices);
41 make_basis_from_normal(normal,
u,
v);
43 float angle_step = glm::two_pi<float>() /
static_cast<float>(n_vertices);
44 for (std::size_t
i = 0;
i < n_vertices; ++
i) {
45 float angle =
i * angle_step;
46 points[
i] = offset + radius * (std::cos(angle) *
u + std::sin(angle) *
v);
50 const glm::vec3 &
operator[](std::size_t index)
const {
return points[index]; }
51 glm::vec3 &
operator[](std::size_t index) {
return points[index]; }
53 std::size_t
size()
const {
return points.size(); }
54 const std::vector<glm::vec3> &
get_points()
const {
return points; }
59 std::vector<glm::vec3> points;
62 static void make_basis_from_normal(
const glm::vec3 &normal, glm::vec3 &
u, glm::vec3 &
v) {
63 glm::vec3
n = glm::normalize(normal);
64 glm::vec3 temp = (std::abs(
n.x) > 0.9f) ? glm::vec3(0, 1, 0) : glm::vec3(1, 0, 0);
65 u = glm::normalize(glm::cross(
n, temp));
66 v = glm::normalize(glm::cross(
n,
u));
74 min = glm::vec3(std::numeric_limits<float>::max());
75 max = glm::vec3(std::numeric_limits<float>::lowest());
77 for (
const auto &
v : xyz_positions) {
100 min = glm::vec2(std::numeric_limits<float>::max());
101 max = glm::vec2(std::numeric_limits<float>::lowest());
103 for (
const auto &
v : xy_positions) {
156 Grid(
int rows,
int cols,
float width = 2.0f,
float height = 2.0f,
float origin_x = 0.0f,
float origin_y = 0.0f,
157 float origin_z = 0.0f);
162 std::vector<Rectangle>
get_selection(
float x0,
float y0,
float x1,
float y1)
const;
164 std::vector<Rectangle>
get_row(
int row)
const;
165 std::vector<Rectangle>
get_column(
int col)
const;
187 float thickness = 0.01);
190 const glm::vec3 bottom_left,
const glm::vec3 bottom_right);
209 bool vertical =
true);
212std::vector<Rectangle>
generate_grid_rectangles(
const glm::vec3 ¢er_position,
float base_width,
float base_height,
213 int num_rectangles_x,
int num_rectangles_y,
float spacing);
216 int num_rectangles_x,
int num_rectangles_y,
float spacing);
219 int num_rectangles_x,
int num_rectangles_y,
float spacing);
224 int minor_segments = 32,
225 float major_radius = 1.0f,
226 float minor_radius = 0.3f
246 int resolution_z = 50,
float max_height = 5.0f,
float base_height = 0.0f,
247 int octaves = 4,
float persistence = 0.5f,
float scale = 50.0f,
253 double t_end,
double step_size,
254 double finite_diff_delta,
float radius = .25,
258 float radius,
int segments);
264 const std::vector<draw_info::IndexedVertexPositions> &extend_ivps);
287 const glm::vec3 &height_dir,
float width,
float height);
289 const glm::vec3 &surface_normal,
float height = 1);
292 int num_segments = 16,
293 float length_thickness_ratio = 0.07);
296 float stem_thickness = 0.12);
299 float tip_length = .05);
302std::vector<glm::vec3>
scale_vertices(
const std::vector<glm::vec3> &vertices,
const glm::vec3 &scale_vector,
303 const glm::vec3 &origin = glm::vec3(0.0f));
305 const glm::vec3 &origin = glm::vec3(0.0f));
311 unsigned int num_sides = 30);
313 unsigned int num_sides = 30);
315std::vector<glm::vec3>
generate_n_gon_vertices(
const glm::vec3 ¢er,
float radius = 1,
unsigned int num_sides = 30);
318 float inner_radius,
int num_segments,
float percent = 1);
320 int num_segments,
float percent = 1);
324std::vector<glm::vec3>
generate_star_vertices(
float center_x,
float center_y,
float outer_radius,
float inner_radius,
325 int num_star_tips,
bool blunt_tips =
false);
Definition draw_info.hpp:85
Definition draw_info.hpp:61
glm::vec2 max
Definition vertex_geometry.hpp:110
std::array< glm::vec2, 4 > get_corners() const
Definition vertex_geometry.hpp:113
glm::vec2 min
Definition vertex_geometry.hpp:109
AxisAlignedBoundingBox2D(const std::vector< glm::vec2 > &xy_positions)
Definition vertex_geometry.hpp:99
AxisAlignedBoundingBox()
Definition vertex_geometry.hpp:72
glm::vec3 min
Definition vertex_geometry.hpp:83
glm::vec3 max
Definition vertex_geometry.hpp:84
AxisAlignedBoundingBox(const std::vector< glm::vec3 > &xyz_positions)
Definition vertex_geometry.hpp:73
draw_info::IndexedVertexPositions get_ivp()
Definition vertex_geometry.cpp:322
std::array< glm::vec3, 8 > get_corners() const
Definition vertex_geometry.hpp:86
Definition vertex_geometry.hpp:154
std::vector< Rectangle > get_selection(float x0, float y0, float x1, float y1) const
Definition vertex_geometry.cpp:219
std::vector< Rectangle > get_rectangles_in_bounding_box(int row1, int col1, int row2, int col2) const
Definition vertex_geometry.cpp:246
std::vector< Rectangle > get_row(int row) const
Definition vertex_geometry.cpp:269
Rectangle get_at(int col, int row) const
Definition vertex_geometry.cpp:204
const int rows
Definition vertex_geometry.hpp:167
Grid(int rows, int cols, float width=2.0f, float height=2.0f, float origin_x=0.0f, float origin_y=0.0f, float origin_z=0.0f)
Definition vertex_geometry.cpp:195
const int cols
Definition vertex_geometry.hpp:168
std::vector< Rectangle > get_column(int col) const
Definition vertex_geometry.cpp:282
glm::vec3 & operator[](std::size_t index)
Definition vertex_geometry.hpp:51
NGon(std::size_t n_vertices, float radius=1.0f, const glm::vec3 &normal=glm::vec3(0, 0, 1), const glm::vec3 &offset=glm::vec3(0, 0, 0), TriangulationMode mode=TriangulationMode::CentralFan)
Definition vertex_geometry.hpp:33
const std::vector< glm::vec3 > & get_points() const
Definition vertex_geometry.hpp:54
NGon(const std::vector< glm::vec3 > &pts, TriangulationMode mode=TriangulationMode::CentralFan)
Definition vertex_geometry.hpp:26
const glm::vec3 & operator[](std::size_t index) const
Definition vertex_geometry.hpp:50
std::size_t size() const
Definition vertex_geometry.hpp:53
TriangulationMode get_triangulation_mode() const
Definition vertex_geometry.hpp:56
Definition vertex_geometry.hpp:126
float height
Definition vertex_geometry.hpp:133
glm::vec3 get_top_center() const
Definition vertex_geometry.cpp:186
glm::vec3 get_center_left() const
Definition vertex_geometry.cpp:188
glm::vec3 get_bottom_right() const
Definition vertex_geometry.cpp:192
float width
Definition vertex_geometry.hpp:132
glm::vec3 get_center_right() const
Definition vertex_geometry.cpp:189
glm::vec3 get_top_left() const
Definition vertex_geometry.cpp:185
Rectangle(glm::vec3 center=glm::vec3(0), float width=2, float height=2)
Definition vertex_geometry.hpp:129
glm::vec3 get_bottom_left() const
Definition vertex_geometry.cpp:190
glm::vec3 center
Definition vertex_geometry.hpp:131
friend std::ostream & operator<<(std::ostream &os, const Rectangle &rect)
Definition vertex_geometry.cpp:21
glm::vec3 get_bottom_center() const
Definition vertex_geometry.cpp:191
draw_info::IndexedVertexPositions get_ivs() const
Definition vertex_geometry.cpp:179
glm::vec3 get_top_right() const
Definition vertex_geometry.cpp:187
Definition vertex_geometry.cpp:19
std::vector< glm::vec3 > generate_rectangle_normals()
Generates normals for each corner of a rectangle.
Definition vertex_geometry.cpp:1667
Rectangle expand_rectangle(const Rectangle &rect, float x_expand, float y_expand)
Definition vertex_geometry.cpp:417
std::vector< glm::vec3 > generate_n_gon_vertices(const glm::vec3 ¢er, float radius, unsigned int num_sides)
generate n equally spaced points on the unit circle
Definition vertex_geometry.cpp:1789
draw_info::IndexedVertexPositions generate_unit_cube()
Definition vertex_geometry.cpp:1630
draw_info::IndexedVertexPositions generate_3d_arrow(const glm::vec3 &start, const glm::vec3 &end, int num_segments, float stem_thickness)
Definition vertex_geometry.cpp:1945
draw_info::IndexedVertexPositions triangulate_ngon(const NGon &ngon)
Definition vertex_geometry.cpp:349
Rectangle create_rectangle_from_top_right(const glm::vec3 &top_right, float width, float height)
Definition vertex_geometry.cpp:302
std::vector< unsigned int > generate_cube_indices()
Definition vertex_geometry.cpp:1658
draw_info::IndexedVertexPositions generate_3d_arrow_with_ratio(const glm::vec3 &start, const glm::vec3 &end, int num_segments, float length_thickness_ratio)
Definition vertex_geometry.cpp:1934
std::vector< Rectangle > weighted_subdivision(const Rectangle &rect, const std::vector< unsigned int > &weights, bool vertical)
Definition vertex_geometry.cpp:494
std::vector< Rectangle > vertical_weighted_subdivision(const Rectangle &rect, const std::vector< unsigned int > &weights)
Definition vertex_geometry.cpp:485
draw_info::IndexedVertexPositions generate_circle(const glm::vec3 center, float radius, unsigned int num_sides)
Definition vertex_geometry.cpp:1761
void scale_vertices_in_place(std::vector< glm::vec3 > &vertices, const glm::vec3 &scale_vector, const glm::vec3 &origin)
Definition vertex_geometry.cpp:2050
std::vector< unsigned int > generate_star_indices(int num_star_tips, bool blunt_tips)
Definition vertex_geometry.cpp:1901
draw_info::IndexedVertexPositions generate_rectangle_between_2d(const glm::vec2 &p1, const glm::vec2 &p2, float thickness)
Definition vertex_geometry.cpp:119
Rectangle shrink_rectangle(const Rectangle &rect, float x_shrink, float y_shrink)
Definition vertex_geometry.cpp:425
bool circle_intersects_rect(float cx, float cy, float radius, const Rectangle &rect)
Definition vertex_geometry.cpp:45
void increment_indices_in_place(std::vector< unsigned int > &indices, unsigned int increase)
Definition vertex_geometry.cpp:2095
std::vector< glm::vec3 > generate_unit_cube_vertices()
Definition vertex_geometry.cpp:1643
void rotate_vertices_in_place(std::vector< glm::vec3 > &vertices, const glm::vec3 &rotation_turns)
Definition vertex_geometry.cpp:2086
std::vector< glm::vec3 > generate_star_vertices(float center_x, float center_y, float outer_radius, float inner_radius, int num_star_tips, bool blunt_tips)
Definition vertex_geometry.cpp:1858
std::vector< Rectangle > subdivide_rectangle(const Rectangle &rect, unsigned int num_subdivisions, bool vertical)
Definition vertex_geometry.cpp:480
Rectangle create_rectangle_from_top_left(const glm::vec3 &top_left, float width, float height)
Definition vertex_geometry.cpp:298
draw_info::IVPNormals generate_icosphere(int subdivisions, float radius)
Definition vertex_geometry.cpp:1236
draw_info::IndexedVertexPositions generate_annulus(float center_x, float center_y, float outer_radius, float inner_radius, int num_segments, float percent)
Definition vertex_geometry.cpp:1807
Rectangle create_rectangle(float x_pos, float y_pos, float width, float height)
Definition vertex_geometry.cpp:294
draw_info::IndexedVertexPositions generate_cylinder_between(const glm::vec3 &p1, const glm::vec3 &p2, int segments, float radius)
Definition vertex_geometry.cpp:1019
std::vector< glm::vec2 > generate_rectangle_texture_coordinates()
Definition vertex_geometry.cpp:1740
std::vector< glm::vec3 > generate_fibonacci_sphere_vertices(int num_samples, float scale)
Definition vertex_geometry.cpp:1917
Rectangle create_rectangle_from_center_left(const glm::vec3 ¢er_left, float width, float height)
Definition vertex_geometry.cpp:314
draw_info::IndexedVertexPositions generate_rectangle(float center_x, float center_y, float width, float height)
Definition vertex_geometry.cpp:670
draw_info::IVPNormals generate_cone(int segments, float height, float radius)
Definition vertex_geometry.cpp:962
draw_info::IndexedVertexPositions generate_grid(const glm::vec3 ¢er_position, float base_width, float base_height, int num_rectangles_x, int num_rectangles_y, float spacing)
Definition vertex_geometry.cpp:567
std::vector< glm::vec3 > scale_vertices(const std::vector< glm::vec3 > &vertices, const glm::vec3 &scale_vector, const glm::vec3 &origin)
Definition vertex_geometry.cpp:2056
std::vector< glm::vec3 > generate_rectangle_vertices_3d(const glm::vec3 ¢er, const glm::vec3 &width_dir, const glm::vec3 &height_dir, float width, float height)
Definition vertex_geometry.cpp:1676
Rectangle slide_rectangle(const Rectangle &rect, int x_offset, int y_offset)
Definition vertex_geometry.cpp:437
std::vector< glm::vec3 > generate_annulus_vertices(float center_x, float center_y, float outer_radius, float inner_radius, int num_segments, float percent)
Definition vertex_geometry.cpp:1813
draw_info::IVPNormals generate_cylinder(int segments, float height, float radius)
Definition vertex_geometry.cpp:1084
std::vector< glm::vec3 > generate_rectangle_vertices_with_z(float center_x, float center_y, float center_z, float width, float height)
Definition vertex_geometry.cpp:694
std::vector< Rectangle > get_rects_intersecting_circle(const Grid &grid, float cx, float cy, float radius)
Definition vertex_geometry.cpp:56
void translate_vertices_in_place(std::vector< glm::vec3 > &vertices, const glm::vec3 &translation)
Definition vertex_geometry.cpp:2071
Rectangle create_rectangle_from_center(const glm::vec3 ¢er, float width, float height)
Definition vertex_geometry.cpp:318
std::vector< glm::vec2 > generate_rectangle_texture_coordinates_flipped_vertically()
Definition vertex_geometry.cpp:1752
draw_info::IndexedVertexPositions generate_cone_between(const glm::vec3 &base, const glm::vec3 &tip, int segments, float radius)
Definition vertex_geometry.cpp:709
Rectangle create_rectangle_from_corners(const glm::vec3 top_left, const glm::vec3 top_right, const glm::vec3 bottom_left, const glm::vec3 bottom_right)
Definition vertex_geometry.cpp:154
std::vector< glm::vec3 > generate_rectangle_vertices(float center_x, float center_y, float width, float height)
Definition vertex_geometry.cpp:680
std::vector< glm::vec3 > generate_arrow_vertices(glm::vec2 start, glm::vec2 end, float stem_thickness, float tip_length)
Create the points of an arrow pointing from one point to another.
Definition vertex_geometry.cpp:1993
std::vector< Rectangle > generate_grid_rectangles(const glm::vec3 ¢er_position, float width, float height, int num_rectangles_x, int num_rectangles_y, float spacing)
Definition vertex_geometry.cpp:538
draw_info::IndexedVertexPositions connect_ngons(const NGon &a, const NGon &b)
Definition vertex_geometry.cpp:381
Rectangle get_bounding_rectangle(const std::vector< Rectangle > &rectangles)
Definition vertex_geometry.cpp:447
draw_info::IVPNormals generate_torus(int major_segments, int minor_segments, float major_radius, float minor_radius)
Definition vertex_geometry.cpp:755
std::vector< glm::vec3 > generate_rectangle_vertices_from_points(const glm::vec3 &point_a, const glm::vec3 &point_b, const glm::vec3 &surface_normal, float height)
Definition vertex_geometry.cpp:1718
Rectangle scale_rectangle_from_left_side(const Rectangle &rect, float x_shrink, float y_shrink)
Definition vertex_geometry.cpp:433
std::vector< unsigned int > generate_rectangle_indices()
Definition vertex_geometry.cpp:1732
void merge_ivps(draw_info::IndexedVertexPositions &base_ivp, const draw_info::IndexedVertexPositions &extend_ivp)
Definition vertex_geometry.cpp:1600
draw_info::IndexedVertexPositions generate_n_gon(const glm::vec3 center, float radius, unsigned int num_sides)
Definition vertex_geometry.cpp:1765
draw_info::IVPNormals generate_terrain(float size_x, float size_z, int resolution_x, int resolution_z, float max_height, float base_height, int octaves, float persistence, float scale, float seed)
Definition vertex_geometry.cpp:1271
draw_info::IVPNormals generate_cube(float size)
Definition vertex_geometry.cpp:807
Rectangle create_rectangle_from_bottom_left(const glm::vec3 &bottom_left, float width, float height)
Definition vertex_geometry.cpp:306
std::vector< unsigned int > generate_square_indices()
Definition vertex_geometry.cpp:668
draw_info::IndexedVertexPositions generate_quad_strip(const std::vector< std::pair< glm::vec3, glm::vec3 > > &lines)
Definition vertex_geometry.cpp:1564
std::vector< unsigned int > flatten_and_increment_indices(const std::vector< std::vector< unsigned int > > &indices)
Flattens and increments a collection of index sets.
Definition vertex_geometry.cpp:606
std::vector< unsigned int > generate_arrow_indices()
Definition vertex_geometry.cpp:2048
std::vector< Rectangle > horizontal_weighted_subdivision(const Rectangle &rect, const std::vector< unsigned int > &weights)
Definition vertex_geometry.cpp:489
draw_info::IndexedVertexPositions generate_function_visualization(std::function< glm::vec3(double)> f, double t_start, double t_end, double step_size, double finite_diff_delta, float radius, int segments)
Definition vertex_geometry.cpp:1496
std::vector< unsigned int > generate_n_gon_indices(unsigned int num_sides)
Definition vertex_geometry.cpp:1769
draw_info::IndexedVertexPositions connect_points_by_rectangles(const std::vector< glm::vec2 > &points)
Definition vertex_geometry.cpp:1480
std::vector< glm::vec3 > generate_square_vertices(float center_x, float center_y, float side_length)
Definition vertex_geometry.cpp:664
draw_info::IndexedVertexPositions text_grid_to_rect_grid(const std::string &text_grid, const vertex_geometry::Rectangle bounding_rect)
Definition vertex_geometry.cpp:74
glm::vec3 f(double t)
Definition vertex_geometry.cpp:1458
draw_info::IVPNormals generate_box(float size_x, float size_y, float size_z)
Definition vertex_geometry.cpp:884
Rectangle create_rectangle_from_bottom_right(const glm::vec3 &bottom_right, float width, float height)
Definition vertex_geometry.cpp:310
TriangulationMode
Definition vertex_geometry.hpp:18
@ CentralFan
Definition vertex_geometry.hpp:19
@ VertexFan
Definition vertex_geometry.hpp:20
draw_info::IndexedVertexPositions generate_segmented_cylinder(const std::vector< std::pair< glm::vec3, glm::vec3 > > &path, float radius, int segments)
Definition vertex_geometry.cpp:1504
std::vector< unsigned int > generate_annulus_indices(int num_segments, float percent)
Definition vertex_geometry.cpp:1836