header_utils
Loading...
Searching...
No Matches
capsule.h
1
4
5#pragma once
6
7#include "segment.h"
8#include "shape_concepts.h"
9#include <glm/ext/scalar_constants.hpp>
10
11namespace ghassanpl::geometry
12{
15 template <std::floating_point T>
16 struct tcapsule
17 {
18 tsegment<T> axis;
19 T radius{};
20
21 auto centroid() const { return axis.center(); }
22
23 bool contains(glm::tvec2<T> pt) const
24 {
25 return axis.distance(pt) <= radius;
26 }
27
28 T edge_length() const
29 {
30 return axis.length() * 2 + glm::pi<T>() * 2 * radius;
31 }
32
33 glm::tvec2<T> edge_point_alpha(T t) const;
34
35 T calculate_area() const { return axis.length() * 2 * radius + glm::pi<T>() * radius * radius; }
36 glm::tvec2<T> edge_point(T t) const { return edge_point_alpha(t / edge_length()); }
37 trec2<T> bounding_box() const { return axis.bounding_box().grown(radius); }
38
39 glm::tvec2<T> closest_point_to(glm::tvec2<T> pt) const
40 {
42 throw "unimplemented";
43 }
44 };
45
46 using capsule = tcapsule<float>;
47
48 static_assert(area_shape<float, capsule>);
49}
A shape for which the concept of an "area" has a finite interpretation.
constexpr __contains_fn contains
contains(range, el)
Definition ranges.h:264
Represents a 2D capsule area_shape.
Definition capsule.h:17
Represents a 2D rectangle polygon_shape.
Definition rec2.h:31
Represents a 2D segment (technically a polygon_shape).
Definition segment.h:15