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

函数

bool coordinate_update_needs_protection (const Result< double > &point_scale, bool numeric_plane_offset)
bool direction_products_need_scaling (double normal_scale, double direction_scale)
bool finite_plane_offset (const Result< ApproxReal > &offset)
double fused_dot_three (const double(&a)[3], const double(&b)[3])
bool interrupts_optional_numeric_evaluation (const CasError &error)
bool point_dot_needs_protection (double normal_scale, const Result< double > &point_scale)
VectorExprListResult protected_coordinate_intersection (const std::vector< double > &normal_values, double normal_scale, const std::vector< double > &direction_values, double direction_scale, const std::vector< double > &point_values, double point_scale, double plane_offset, const std::string &operation)
std::shared_ptr< SymbolicExpr > scale_plane_offset (const std::shared_ptr< SymbolicExpr > &offset, double normal_scale, bool protect_point_dot)
void scale_symbolic_components (const std::vector< double > &values, double scale, bool protect_point_dot, std::vector< std::shared_ptr< SymbolicExpr > > &scaled)
VectorExprListResult symbolic_line_plane_intersection (const std::vector< std::shared_ptr< SymbolicExpr > > &normal, const std::vector< std::shared_ptr< SymbolicExpr > > &direction, const std::vector< std::shared_ptr< SymbolicExpr > > &point, const std::shared_ptr< SymbolicExpr > &offset, ComputationContext &context, const std::string &operation)
ExpressionResult symbolic_point_plane_distance (const std::vector< std::shared_ptr< SymbolicExpr > > &point, const std::vector< std::shared_ptr< SymbolicExpr > > &normal, const std::shared_ptr< SymbolicExpr > &offset, ComputationContext &context, const std::string &operation)
Result< void > validate_intersection_inputs (const LineSymbolic &line, const PlaneSymbolic &plane, ComputationContext &context, const std::string &operation)

函数说明

◆ coordinate_update_needs_protection()

bool LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::coordinate_update_needs_protection ( const Result< double > & point_scale,
bool numeric_plane_offset )

在文件 symbolic_geometry_line_plane.cpp 第 54 行定义.

56 {
57 return point_scale.has_value() && numeric_plane_offset &&
58 point_scale.value() > std::numeric_limits<double>::max() / 3.0;
59}
bool has_value() const noexcept

引用了 coordinate_update_needs_protection(), LMCAS::Result< T >::has_value() , 以及 LMCAS::Result< T >::value().

被这些函数引用 coordinate_update_needs_protection().

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

◆ direction_products_need_scaling()

bool LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::direction_products_need_scaling ( double normal_scale,
double direction_scale )

在文件 symbolic_geometry_line_plane.cpp 第 39 行定义.

39 {
40 const double safe_high = std::numeric_limits<double>::max() / 3.0;
41 const double safe_low = std::numeric_limits<double>::min();
42 return normal_scale > safe_high / direction_scale ||
43 normal_scale < safe_low / direction_scale;
44}

引用了 direction_products_need_scaling().

被这些函数引用 direction_products_need_scaling().

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

◆ finite_plane_offset()

bool LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::finite_plane_offset ( const Result< ApproxReal > & offset)

在文件 symbolic_geometry_line_plane.cpp 第 34 行定义.

34 {
35 return offset.has_value() && offset.value().is_finite() &&
36 std::isfinite(offset.value().value);
37}

引用了 finite_plane_offset(), LMCAS::Result< T >::has_value() , 以及 LMCAS::Result< T >::value().

被这些函数引用 finite_plane_offset().

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

◆ fused_dot_three()

double LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::fused_dot_three ( const double(&) a[3],
const double(&) b[3] )

在文件 symbolic_geometry_line_plane.cpp 第 85 行定义.

85 {
86 return std::fma(a[0], b[0], std::fma(a[1], b[1], a[2] * b[2]));
87}
const MultiPoly & b
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a

引用了 LMCAS::a, LMCAS::b , 以及 fused_dot_three().

被这些函数引用 fused_dot_three() , 以及 protected_coordinate_intersection().

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

◆ interrupts_optional_numeric_evaluation()

bool LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::interrupts_optional_numeric_evaluation ( const CasError & error)

在文件 symbolic_geometry_line_plane.cpp 第 29 行定义.

29 {
30 return error.code == CasErrc::Cancelled ||
32}

引用了 LMCAS::Cancelled, LMCAS::CasError::code, interrupts_optional_numeric_evaluation() , 以及 LMCAS::ResourceLimit.

被这些函数引用 interrupts_optional_numeric_evaluation().

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

◆ point_dot_needs_protection()

bool LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::point_dot_needs_protection ( double normal_scale,
const Result< double > & point_scale )

在文件 symbolic_geometry_line_plane.cpp 第 46 行定义.

48 {
49 return point_scale.has_value() && point_scale.value() > 0.0 &&
50 normal_scale >
51 std::numeric_limits<double>::max() / point_scale.value() / 3.0;
52}

引用了 LMCAS::Result< T >::has_value(), point_dot_needs_protection() , 以及 LMCAS::Result< T >::value().

被这些函数引用 point_dot_needs_protection().

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

◆ protected_coordinate_intersection()

VectorExprListResult LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::protected_coordinate_intersection ( const std::vector< double > & normal_values,
double normal_scale,
const std::vector< double > & direction_values,
double direction_scale,
const std::vector< double > & point_values,
double point_scale,
double plane_offset,
const std::string & operation )

在文件 symbolic_geometry_line_plane.cpp 第 89 行定义.

94 {
95 const double plane_location = plane_offset / normal_scale;
96 if (!std::isfinite(plane_location)) {
99 "line-plane intersection coordinate is outside the supported domain",
100 operation);
101 }
102 double spatial_scale = std::max(point_scale, std::abs(plane_location));
103 if (spatial_scale == 0.0) spatial_scale = 1.0;
104
105 double unit_normal[3];
106 double unit_direction[3];
107 double scaled_point[3];
108 for (size_t i = 0; i < 3; ++i) {
109 unit_normal[i] = normal_values[i] / normal_scale;
110 unit_direction[i] = direction_values[i] / direction_scale;
111 scaled_point[i] = point_values[i] / spatial_scale;
112 }
113 const double denominator = fused_dot_three(unit_normal, unit_direction);
114 if (denominator == 0.0) {
117 "line is parallel to plane, so no unique intersection exists",
118 operation);
119 }
120 const double point_dot = fused_dot_three(unit_normal, scaled_point);
121 const double scaled_offset = plane_location / spatial_scale;
122 const double parameter = (scaled_offset - point_dot) / denominator;
123
124 std::vector<std::shared_ptr<SymbolicExpr>> intersection;
125 intersection.reserve(3);
126 for (size_t i = 0; i < 3; ++i) {
127 const double scaled_coordinate = std::fma(
128 parameter, unit_direction[i], scaled_point[i]);
129 const double coordinate = scaled_coordinate * spatial_scale;
130 if (!std::isfinite(coordinate)) {
133 "line-plane intersection coordinate is outside the supported domain",
134 operation);
135 }
136 intersection.push_back(SymbolicExpr::number(coordinate));
137 }
138 return VectorExprListResult::success(std::move(intersection));
139}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(std::vector< std::shared_ptr< SymbolicExpr > > value)
const ExprPtr & denominator

引用了 LMCAS::denominator, LMCAS::DomainError, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), fused_dot_three(), LMCAS::NumericFailure, protected_coordinate_intersection() , 以及 LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success().

被这些函数引用 protected_coordinate_intersection().

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

◆ scale_plane_offset()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::scale_plane_offset ( const std::shared_ptr< SymbolicExpr > & offset,
double normal_scale,
bool protect_point_dot )

在文件 symbolic_geometry_line_plane.cpp 第 73 行定义.

76 {
77 auto scaled = SymbolicExpr::divide(
78 offset, SymbolicExpr::number(normal_scale));
79 if (protect_point_dot) {
80 scaled = SymbolicExpr::divide(scaled, SymbolicExpr::number(3.0));
81 }
82 return scaled;
83}

引用了 scale_plane_offset().

被这些函数引用 scale_plane_offset().

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

◆ scale_symbolic_components()

void LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::scale_symbolic_components ( const std::vector< double > & values,
double scale,
bool protect_point_dot,
std::vector< std::shared_ptr< SymbolicExpr > > & scaled )

在文件 symbolic_geometry_line_plane.cpp 第 61 行定义.

64 {
65 scaled.reserve(values.size());
66 for (double component : values) {
67 double scaled_component = component / scale;
68 if (protect_point_dot) scaled_component /= 3.0;
69 scaled.push_back(SymbolicExpr::number(scaled_component));
70 }
71}

引用了 scale_symbolic_components().

被这些函数引用 scale_symbolic_components().

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

◆ symbolic_line_plane_intersection()

VectorExprListResult LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_line_plane_intersection ( const std::vector< std::shared_ptr< SymbolicExpr > > & normal,
const std::vector< std::shared_ptr< SymbolicExpr > > & direction,
const std::vector< std::shared_ptr< SymbolicExpr > > & point,
const std::shared_ptr< SymbolicExpr > & offset,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_line_plane.cpp 第 141 行定义.

147 {
148 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
149 (context).limits().max_ast_nodes, "transform");
150 auto n_dot_a = vector_dot_checked(normal, point, context);
151 if (!n_dot_a) return VectorExprListResult::failure(n_dot_a.error());
152 auto n_dot_b = vector_dot_checked(normal, direction, context);
153 if (!n_dot_b) return VectorExprListResult::failure(n_dot_b.error());
154 auto denom = detail::make_expression_ptr(detail::normalize_node(detail::node(n_dot_b.value()), transform_budget));
156 denom, context, operation,
157 "line is parallel to plane, so no unique intersection exists",
158 "line-plane denominator nonzero condition cannot be verified");
159 if (!nonzero) return VectorExprListResult::failure(nonzero.error());
160
161 auto t = SymbolicExpr::divide(
162 SymbolicExpr::add(
163 offset,
164 SymbolicExpr::multiply(SymbolicExpr::number(-1), n_dot_a.value())),
165 denom);
166 std::vector<std::shared_ptr<SymbolicExpr>> intersection;
167 intersection.reserve(point.size());
168 for (size_t i = 0; i < point.size(); ++i) {
169 auto coord = SymbolicExpr::add(
170 point[i], SymbolicExpr::multiply(t, direction[i]));
171 auto simplified = simplify_checked(
172 coord, operation,
173 "line-plane intersection coordinate is outside the supported domain", context);
174 if (!simplified) {
175 return VectorExprListResult::failure(simplified.error());
176 }
177 intersection.push_back(std::move(simplified.value()));
178 }
179 return VectorExprListResult::success(std::move(intersection));
180} catch (const CasError& error) {
181 return VectorExprListResult::failure(error);
182} catch (const std::bad_alloc&) {
183 return VectorExprListResult::failure(CasErrc::ResourceLimit, "allocation failed", operation);
184} catch (const std::length_error& error) {
185 return VectorExprListResult::failure(CasErrc::ResourceLimit, error.what(), operation);
186} catch (const std::exception& error) {
187 return VectorExprListResult::failure(CasErrc::InternalInvariant, error.what(), operation);
188}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
ExpressionResult simplify_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, ComputationContext &context)
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)
const std::string const LimitExprPtr & point
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::string const LimitExprPtr LimitDirection direction
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t
ExpressionResult vector_dot_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)

引用了 LMCAS::geometry_detail::checked_nonzero_numeric_or_exact(), LMCAS::context, LMCAS::direction, LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::point, LMCAS::geometry_detail::simplify_checked(), LMCAS::Result< std::vector< std::shared_ptr< SymbolicExpr > > >::success(), symbolic_line_plane_intersection(), LMCAS::t , 以及 LMCAS::vector_dot_checked().

被这些函数引用 symbolic_line_plane_intersection().

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

◆ symbolic_point_plane_distance()

ExpressionResult LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::symbolic_point_plane_distance ( const std::vector< std::shared_ptr< SymbolicExpr > > & point,
const std::vector< std::shared_ptr< SymbolicExpr > > & normal,
const std::shared_ptr< SymbolicExpr > & offset,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_line_plane.cpp 第 190 行定义.

195 {
196 auto n_dot_r = vector_dot_checked(normal, point, context);
197 if (!n_dot_r) return ExpressionResult::failure(n_dot_r.error());
198 auto norm_sq = vector_dot_checked(normal, normal, context);
199 if (!norm_sq) return ExpressionResult::failure(norm_sq.error());
200
201 auto diff = SymbolicExpr::add(
202 n_dot_r.value(),
203 SymbolicExpr::multiply(SymbolicExpr::number(-1), offset));
204 auto norm_n = SymbolicExpr::sqrt(norm_sq.value());
208 std::vector<std::shared_ptr<const SymbolicNode>>{
209 LMCAS::detail::node(diff)}));
210 return simplify_checked(
211 SymbolicExpr::divide(abs_diff, norm_n),
212 operation,
213 "point-plane distance is outside the supported domain", context);
214}
std::shared_ptr< const Node > make_node(Args &&... args)

引用了 LMCAS::FunctionNode::Abs, LMCAS::context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::point, LMCAS::geometry_detail::simplify_checked(), symbolic_point_plane_distance() , 以及 LMCAS::vector_dot_checked().

被这些函数引用 symbolic_point_plane_distance().

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

◆ validate_intersection_inputs()

Result< void > LMCAS::anonymous_namespace{symbolic_geometry_line_plane.cpp}::validate_intersection_inputs ( const LineSymbolic & line,
const PlaneSymbolic & plane,
ComputationContext & context,
const std::string & operation )

在文件 symbolic_geometry_line_plane.cpp 第 18 行定义.

21 {
22 auto line_valid = validate_line_checked(line, context, operation);
23 if (!line_valid) return line_valid;
24 auto plane_valid = validate_plane_checked(plane, context, operation);
25 if (!plane_valid) return plane_valid;
26 return context.consume_steps(6, operation);
27}
Result< void > validate_plane_checked(const PlaneSymbolic &plane, ComputationContext &context, const std::string &operation)
Result< void > validate_line_checked(const LineSymbolic &line, ComputationContext &context, const std::string &operation)
const PlaneSymbolic & plane

引用了 LMCAS::context, LMCAS::plane, validate_intersection_inputs(), LMCAS::geometry_detail::validate_line_checked() , 以及 LMCAS::geometry_detail::validate_plane_checked().

被这些函数引用 validate_intersection_inputs().

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