LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp} 命名空间参考

函数

void append_scaled_plane_edges (const std::vector< double > &p1, const std::vector< double > &p2, const std::vector< double > &p3, double point_scale, std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2)
Result< void > append_symbolic_plane_edges (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3, std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2, const std::string &operation, ComputationContext &context)
PlaneSymbolicResult assemble_plane (std::vector< std::shared_ptr< SymbolicExpr > > &&normal, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, const std::string &operation)
Result< void > build_plane_edges (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3, std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2, ComputationContext &context, const std::string &operation)
Result< void > check_plane_normal_nonzero (const std::vector< std::shared_ptr< SymbolicExpr > > &normal, bool numeric_edges, ComputationContext &context, const std::string &operation)
bool is_plane_budget_error (const Result< double > &result)
bool plane_point_differences_overflow (const std::vector< double > &p1, const std::vector< double > &p2, const std::vector< double > &p3)
Result< bool > scale_plane_edges_for_cross (std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2, ComputationContext &context, const std::string &operation)

函数说明

◆ append_scaled_plane_edges()

void LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::append_scaled_plane_edges ( const std::vector< double > & p1,
const std::vector< double > & p2,
const std::vector< double > & p3,
double point_scale,
std::vector< std::shared_ptr< SymbolicExpr > > & v1,
std::vector< std::shared_ptr< SymbolicExpr > > & v2 )

在文件 symbolic_geometry_plane.cpp 第 36 行定义.

42 {
43 for (size_t i = 0; i < 3; ++i) {
44 v1.push_back(SymbolicExpr::number(
45 p2[i] / point_scale - p1[i] / point_scale));
46 v2.push_back(SymbolicExpr::number(
47 p3[i] / point_scale - p1[i] / point_scale));
48 }
49}
__attribute__((visibility("default"))) LineSymbolicResult line_from_two_points_checked(const std __attribute__((visibility("default"))) LineSymbolicResult line_from_two_points_checked(const std __attribute__((visibility("default"))) PlaneSymbolicResult plane_from_three_points_checked(const std __attribute__((visibility("default"))) PlaneSymbolicResult plane_from_three_points_checked(const std const PlaneSymbolic & p2

引用了 append_scaled_plane_edges() , 以及 LMCAS::p2.

被这些函数引用 append_scaled_plane_edges() , 以及 build_plane_edges().

函数调用图:
这是这个函数的调用关系图:

◆ append_symbolic_plane_edges()

Result< void > LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::append_symbolic_plane_edges ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2,
const std::vector< std::shared_ptr< SymbolicExpr > > & p3,
std::vector< std::shared_ptr< SymbolicExpr > > & v1,
std::vector< std::shared_ptr< SymbolicExpr > > & v2,
const std::string & operation,
ComputationContext & context )

在文件 symbolic_geometry_plane.cpp 第 51 行定义.

57 {
58 for (size_t i = 0; i < 3; ++i) {
59 auto left = simplify_checked(
60 SymbolicExpr::add(
61 p2[i],
62 SymbolicExpr::multiply(SymbolicExpr::number(-1), p1[i])),
63 operation,
64 "plane edge vector is outside the supported domain", context);
65 if (!left) return Result<void>::failure(left.error());
67 SymbolicExpr::add(
68 p3[i],
69 SymbolicExpr::multiply(SymbolicExpr::number(-1), p1[i])),
70 operation,
71 "plane edge vector is outside the supported domain", context);
72 if (!right) return Result<void>::failure(right.error());
73 v1.push_back(std::move(left.value()));
74 v2.push_back(std::move(right.value()));
75 }
76 return Result<void>::success();
77}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
ExpressionResult simplify_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const ExprPtr & right

引用了 append_symbolic_plane_edges(), LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::p2, LMCAS::right, LMCAS::geometry_detail::simplify_checked() , 以及 LMCAS::Result< T >::success().

被这些函数引用 append_symbolic_plane_edges() , 以及 build_plane_edges().

函数调用图:
这是这个函数的调用关系图:

◆ assemble_plane()

PlaneSymbolicResult LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::assemble_plane ( std::vector< std::shared_ptr< SymbolicExpr > > && normal,
const std::vector< std::shared_ptr< SymbolicExpr > > & point,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_plane.cpp 第 188 行定义.

192 {
193 auto d = vector_dot_checked(normal, point, context);
194 if (!d) return PlaneSymbolicResult::failure(d.error());
195 auto d_simplified = simplify_checked(
196 d.value(), operation,
197 "plane constant is outside the supported domain", context);
198 if (!d_simplified) return PlaneSymbolicResult::failure(d_simplified.error());
199
201 plane.normal = std::move(normal);
202 for (auto& component : plane.normal) {
203 auto simplified = simplify_checked(
204 component, operation,
205 "plane normal component is outside the supported domain", context);
206 if (!simplified) return PlaneSymbolicResult::failure(simplified.error());
207 component = std::move(simplified.value());
208 }
209 plane.d = std::move(d_simplified.value());
210 return PlaneSymbolicResult::success(std::move(plane));
211}
const std::string const LimitExprPtr & point
const PlaneSymbolic & plane
std::vector< std::shared_ptr< SymbolicExpr > > normal
法向量。
ExpressionResult vector_dot_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)
std::shared_ptr< SymbolicExpr > d
常数项。
由法向量和常数 d 定义的符号平面 ax + by + cz = d。

引用了 assemble_plane(), LMCAS::context, LMCAS::PlaneSymbolic::d, LMCAS::Result< PlaneSymbolic >::failure(), LMCAS::PlaneSymbolic::normal, LMCAS::plane, LMCAS::point, LMCAS::geometry_detail::simplify_checked(), LMCAS::Result< PlaneSymbolic >::success() , 以及 LMCAS::vector_dot_checked().

被这些函数引用 assemble_plane().

函数调用图:
这是这个函数的调用关系图:

◆ build_plane_edges()

Result< void > LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::build_plane_edges ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2,
const std::vector< std::shared_ptr< SymbolicExpr > > & p3,
std::vector< std::shared_ptr< SymbolicExpr > > & v1,
std::vector< std::shared_ptr< SymbolicExpr > > & v2,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_plane.cpp 第 79 行定义.

86 {
87 std::vector<double> p1_values;
88 std::vector<double> p2_values;
89 std::vector<double> p3_values;
90 auto p1_scale = numeric_vector_scale_checked(
91 p1, context, operation, &p1_values);
92 auto p2_scale = numeric_vector_scale_checked(
93 p2, context, operation, &p2_values);
94 auto p3_scale = numeric_vector_scale_checked(
95 p3, context, operation, &p3_values);
96 if (is_plane_budget_error(p1_scale)) {
97 return Result<void>::failure(p1_scale.error());
98 }
99 if (is_plane_budget_error(p2_scale)) {
100 return Result<void>::failure(p2_scale.error());
101 }
102 if (is_plane_budget_error(p3_scale)) {
103 return Result<void>::failure(p3_scale.error());
104 }
105
106 const bool numeric_points =
107 p1_scale.has_value() && p2_scale.has_value() && p3_scale.has_value();
108 bool scale_differences = false;
109 double point_scale = 0.0;
110 if (numeric_points) {
111 point_scale = std::max(
112 p1_scale.value(), std::max(p2_scale.value(), p3_scale.value()));
113 scale_differences = plane_point_differences_overflow(
114 p1_values, p2_values, p3_values);
115 }
116 v1.reserve(3);
117 v2.reserve(3);
118 if (scale_differences) {
120 p1_values, p2_values, p3_values, point_scale, v1, v2);
121 return Result<void>::success();
122 }
123 return append_symbolic_plane_edges(p1, p2, p3, v1, v2, operation, context);
124}
Result< void > append_symbolic_plane_edges(const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, const std::vector< std::shared_ptr< SymbolicExpr > > &p3, std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2, const std::string &operation, ComputationContext &context)
void append_scaled_plane_edges(const std::vector< double > &p1, const std::vector< double > &p2, const std::vector< double > &p3, double point_scale, std::vector< std::shared_ptr< SymbolicExpr > > &v1, std::vector< std::shared_ptr< SymbolicExpr > > &v2)
bool plane_point_differences_overflow(const std::vector< double > &p1, const std::vector< double > &p2, const std::vector< double > &p3)
Result< double > numeric_vector_scale_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &expressions, ComputationContext &context, const std::string &operation, std::vector< double > *values=nullptr)

引用了 append_scaled_plane_edges(), append_symbolic_plane_edges(), build_plane_edges(), LMCAS::context, LMCAS::Result< T >::failure(), is_plane_budget_error(), LMCAS::geometry_detail::numeric_vector_scale_checked(), LMCAS::p2, plane_point_differences_overflow() , 以及 LMCAS::Result< T >::success().

被这些函数引用 build_plane_edges().

函数调用图:
这是这个函数的调用关系图:

◆ check_plane_normal_nonzero()

Result< void > LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::check_plane_normal_nonzero ( const std::vector< std::shared_ptr< SymbolicExpr > > & normal,
bool numeric_edges,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_plane.cpp 第 163 行定义.

167 {
168 Result<void> nonzero = numeric_edges
170 normal, context, operation,
171 "three points are collinear, so no unique plane exists",
172 "plane normal nonzero condition cannot be verified")
173 : Result<void>::failure(
175 "plane normal nonzero condition cannot be verified",
176 operation);
177 if (!numeric_edges) {
178 auto norm_sq = vector_dot_checked(normal, normal, context);
179 if (!norm_sq) return Result<void>::failure(norm_sq.error());
181 norm_sq.value(), context, operation,
182 "three points are collinear, so no unique plane exists",
183 "plane normal nonzero condition cannot be verified");
184 }
185 return nonzero;
186}
Result< void > checked_nonzero_numeric_or_exact(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation, const std::string &domain_message, const std::string &inconclusive_message)
Result< void > checked_nonzero_numeric_vector(const std::vector< std::shared_ptr< SymbolicExpr > > &expressions, ComputationContext &context, const std::string &operation, const std::string &domain_message, const std::string &inconclusive_message)

引用了 check_plane_normal_nonzero(), LMCAS::geometry_detail::checked_nonzero_numeric_or_exact(), LMCAS::geometry_detail::checked_nonzero_numeric_vector(), LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::Inconclusive , 以及 LMCAS::vector_dot_checked().

被这些函数引用 check_plane_normal_nonzero().

函数调用图:
这是这个函数的调用关系图:

◆ is_plane_budget_error()

bool LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::is_plane_budget_error ( const Result< double > & result)

在文件 symbolic_geometry_plane.cpp 第 17 行定义.

17 {
18 return !result &&
19 (result.error().code == CasErrc::Cancelled ||
21}
CasError & error()

引用了 LMCAS::Cancelled, LMCAS::CasError::code, LMCAS::Result< T >::error(), is_plane_budget_error() , 以及 LMCAS::ResourceLimit.

被这些函数引用 build_plane_edges(), is_plane_budget_error() , 以及 scale_plane_edges_for_cross().

函数调用图:
这是这个函数的调用关系图:

◆ plane_point_differences_overflow()

bool LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::plane_point_differences_overflow ( const std::vector< double > & p1,
const std::vector< double > & p2,
const std::vector< double > & p3 )

在文件 symbolic_geometry_plane.cpp 第 23 行定义.

26 {
27 for (size_t i = 0; i < 3; ++i) {
28 if (!std::isfinite(p2[i] - p1[i]) ||
29 !std::isfinite(p3[i] - p1[i])) {
30 return true;
31 }
32 }
33 return false;
34}

引用了 LMCAS::p2 , 以及 plane_point_differences_overflow().

被这些函数引用 build_plane_edges() , 以及 plane_point_differences_overflow().

函数调用图:
这是这个函数的调用关系图:

◆ scale_plane_edges_for_cross()

Result< bool > LMCAS::anonymous_namespace{symbolic_geometry_plane.cpp}::scale_plane_edges_for_cross ( std::vector< std::shared_ptr< SymbolicExpr > > & v1,
std::vector< std::shared_ptr< SymbolicExpr > > & v2,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_plane.cpp 第 126 行定义.

130 {
131 std::vector<double> v1_values;
132 std::vector<double> v2_values;
133 auto v1_scale = numeric_vector_scale_checked(
134 v1, context, operation, &v1_values);
135 auto v2_scale = numeric_vector_scale_checked(
136 v2, context, operation, &v2_values);
137 const bool numeric_edges = v1_scale.has_value() && v2_scale.has_value();
138 if (!numeric_edges) {
139 if (is_plane_budget_error(v1_scale) || is_plane_budget_error(v2_scale)) {
141 !v1_scale ? v1_scale.error() : v2_scale.error());
142 }
143 } else if (v1_scale.value() != 0.0 && v2_scale.value() != 0.0) {
144 const double safe_high =
145 std::sqrt(std::numeric_limits<double>::max() / 12.0);
146 const double safe_low =
147 std::sqrt(std::numeric_limits<double>::min());
148 const bool scale_cross =
149 v1_scale.value() > safe_high / v2_scale.value() ||
150 v1_scale.value() < safe_low / v2_scale.value();
151 if (scale_cross) {
152 for (size_t i = 0; i < 3; ++i) {
153 v1[i] = SymbolicExpr::number(
154 v1_values[i] / v1_scale.value());
155 v2[i] = SymbolicExpr::number(
156 v2_values[i] / v2_scale.value());
157 }
158 }
159 }
160 return Result<bool>::success(numeric_edges);
161}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), is_plane_budget_error(), LMCAS::geometry_detail::numeric_vector_scale_checked(), scale_plane_edges_for_cross() , 以及 LMCAS::Result< T >::success().

被这些函数引用 scale_plane_edges_for_cross().

函数调用图:
这是这个函数的调用关系图: