ProjGeom 1.0.11
Loading...
Searching...
No Matches
pg_common.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <array>
8#include <tuple>
9
10#include "common_concepts.h"
11
12namespace fun {
13
25 template <Ring _K> auto cross0(const std::array<_K, 3>& v_a, const std::array<_K, 3>& v_b)
26 -> _K {
27 return v_a[1] * v_b[2] - v_b[1] * v_a[2];
28 }
29
41 template <Ring _K> auto cross1(const std::array<_K, 3>& v_a, const std::array<_K, 3>& v_b)
42 -> _K {
43 return v_a[0] * v_b[2] - v_b[0] * v_a[2];
44 }
45
57 template <Ring _K> auto cross2(const std::array<_K, 3>& v_a, const std::array<_K, 3>& v_b)
58 -> _K {
59 return v_a[0] * v_b[1] - v_b[0] * v_a[1];
60 }
61
77 template <typename Point>
78 requires Ring<Value_type<Point>>
79 auto cross(const Point& v_a, const Point& v_b) -> std::array<Value_type<Point>, 3> {
80 return {cross0(v_a, v_b), -cross1(v_a, v_b), cross2(v_a, v_b)};
81 }
82
94 template <Ring _K> auto dot_c(const std::array<_K, 3>& v_a, const std::array<_K, 3>& v_b)
95 -> _K {
96 const auto& [x1, y1, z1] = v_a;
97 const auto& [x2, y2, z2] = v_b;
98 return x1 * x2 + y1 * y2 + z1 * z2;
99 }
100
115 template <Ring _T, Ring _K> auto plucker_c(const _T& lambda_val, const std::array<_K, 3>& v_a,
116 const _T& mu_val, const std::array<_K, 3>& v_b)
117 -> std::array<_K, 3> {
118 const auto& [x1, y1, z1] = v_a;
119 const auto& [x2, y2, z2] = v_b;
120 return {lambda_val * x1 + mu_val * x2, lambda_val * y1 + mu_val * y2,
121 lambda_val * z1 + mu_val * z2};
122 }
123
135 template <Ring _K> auto dot1(const std::array<_K, 3>& v_a, const std::array<_K, 3>& v_b) -> _K {
136 return v_a[0] * v_b[0] + v_a[1] * v_b[1];
137 }
138
150 template <Ring _K> auto dot2(const std::array<_K, 3>& v_a, const std::array<_K, 3>& v_b) -> _K {
151 return v_a[0] * v_b[0] + v_a[2] * v_b[2];
152 }
153
164 template <typename T> constexpr auto sq(const T& a) { return a * a; }
165
183 template <typename Value, typename Point>
184 requires Ring<Value>
185 constexpr auto parametrize(const Value& lambda_val, const Point& pt_p, const Value& mu_val,
186 const Point& pt_q) -> Point {
187 return Point::parametrize(lambda_val, pt_p, mu_val, pt_q);
188 }
189
190} // namespace fun
Common C++20 concepts: Ring, OrderedRing, Integral, Sequence.
Definition ck_concepts.hpp:11
auto cross0(const std::array< _K, 3 > &v_a, const std::array< _K, 3 > &v_b) -> _K
1st term of Cross product (yz-plane projection)
Definition pg_common.hpp:25
auto cross2(const std::array< _K, 3 > &v_a, const std::array< _K, 3 > &v_b) -> _K
3rd term of Cross product (xy-plane projection)
Definition pg_common.hpp:57
auto dot1(const std::array< _K, 3 > &v_a, const std::array< _K, 3 > &v_b) -> _K
Dot product of the (x,y)-components of two vectors (affine part)
Definition pg_common.hpp:135
auto plucker_c(const _T &lambda_val, const std::array< _K, 3 > &v_a, const _T &mu_val, const std::array< _K, 3 > &v_b) -> std::array< _K, 3 >
generic Plücker linear combination
Definition pg_common.hpp:115
auto cross(const Point &v_a, const Point &v_b) -> std::array< Value_type< Point >, 3 >
Cross product in homogeneous 3D coordinates.
Definition pg_common.hpp:79
constexpr auto parametrize(const Value &lambda_val, const Point &pt_p, const Value &mu_val, const Point &pt_q) -> Point
Homogeneous parametrization of point or line (free function)
Definition pg_common.hpp:185
auto dot_c(const std::array< _K, 3 > &v_a, const std::array< _K, 3 > &v_b) -> _K
Dot product (full 3-component)
Definition pg_common.hpp:94
auto dot2(const std::array< _K, 3 > &v_a, const std::array< _K, 3 > &v_b) -> _K
Dot product of the (0,2)-component of two vectors.
Definition pg_common.hpp:150
auto cross1(const std::array< _K, 3 > &v_a, const std::array< _K, 3 > &v_b) -> _K
2nd term of Cross product (xz-plane projection)
Definition pg_common.hpp:41
constexpr auto sq(const T &a)
Square function.
Definition pg_common.hpp:164