69 normal = (
cross(edge1, edge2)).
template normalized<t_type>();
72 constexpr Plane(
const Ray<t_dims, t_type>& _normal, t_type _d)
76 constexpr void negate()
81 template<u
int01 t_new_dims,
class t_new_type>
82 [[nodiscard]] Plane<t_new_dims, t_new_type> as()
const
84 return Plane<t_new_dims, t_new_type>(normal.template as<t_new_dims, t_new_type>(),
cast<t_new_type>(d));
90 t_type dot_product = distanceTo(pos);
92 return PlanePosition::e_above_plane;
93 else if (dot_product < 0)
94 return PlanePosition::e_below_plane;
96 return PlanePosition::e_on_plane;
100 return distanceTo(pos) > 0;
104 return distanceTo(pos) < 0;
108 return distanceTo(pos) == 0;
112 return dot(normal, pos) - d;
117 t_type V0 =
dot(normal, pos) - d;
123 t_type Vd =
dot(normal, line.
ray());
124 t_type V0 =
dot(normal, line[A]) - d;
126 if (
abs(Vd) < epsilon)
128 return abs(V0) < epsilon ? Constant<t_type>::Invalid : Constant<t_type>::Max;
130 t_type distance_along_line = -V0 / Vd;
131 return distance_along_line;
136 t_type distance_along_line = calculateIntersectionPos(line, epsilon);
141 [[nodiscard]]
Matrix<t_type> projectionMatrix(
const Ray<3, t_type>& up = Ray<3, t_type>(0,0,1))
const
154 right = right.template normalized<t_type>();
158 right[X], backward[X], normal[X], 0
159 , right[Y], backward[Y], normal[Y], 0
160 , right[Z], backward[Z], normal[Z], 0
161 , offset[X], offset[Y], offset[Z], 1);
164 template<
class t_buffer_type>
167 const uint04 vertex_size = points.size();
168 lib_assert(vertex_size >= 3,
"Plane requires at least 3 points");
177 for(
uint04 i = 0; i < vertex_size; i++)
180 v =
cross((p3 - p2), (p1 - p2));
181 if(v[t_dims - 1] != 0)
186 centroid += points[i];
192 v =
cross((p3 - p2), (p1 - p2));
193 if(v[t_dims - 1] != 0)
199 v =
cross((p3 - p2), (p1 - p2));
203 n = n.template normalized<t_type>();
204 if (
dot(direction_reference, n) < 0)
206 Plane plane(n,
dot(n, centroid));
213 return (
abs(
dot(b, normal)) < epsilon);
215 bool isSamePlane(
const Plane& plane, t_type epsilon)
const
217 return (
equals(normal, plane.normal, epsilon) &&
abs(d - plane.d) < epsilon)
218 || (
equals(-normal, plane.normal, epsilon) &&
abs(d + plane.d) < epsilon);
221 bool operator==(
const Plane& plane)
const
223 return normal == plane.normal && d == plane.d;
225 bool operator!=(
const Plane& plane)
const
227 return normal != plane.normal || d != plane.d;
230 Ray<t_dims, t_type> normal;
constexpr bool equals(const LineSegment< t_dims, t_type, t_vertex > &left, const LineSegment< t_dims, t_type, t_vertex > &right, const t_type &epsilon=cast< t_type >(0))
Tests if objects are considered equal.