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

函数

Result< double > point_difference_scale_checked (const std::vector< std::shared_ptr< SymbolicExpr > > &p1, const std::vector< std::shared_ptr< SymbolicExpr > > &p2, ComputationContext &context, const std::string &operation, std::vector< double > &p1_values, std::vector< double > &p2_values)
ExpressionResult skew_distance_from_directions (const std::vector< std::shared_ptr< SymbolicExpr > > &direction1, const std::vector< std::shared_ptr< SymbolicExpr > > &direction2, const std::vector< std::shared_ptr< SymbolicExpr > > &difference, double point_scale, ComputationContext &context, const std::string &operation)

函数说明

◆ point_difference_scale_checked()

Result< double > LMCAS::anonymous_namespace{symbolic_geometry_line.cpp}::point_difference_scale_checked ( const std::vector< std::shared_ptr< SymbolicExpr > > & p1,
const std::vector< std::shared_ptr< SymbolicExpr > > & p2,
ComputationContext & context,
const std::string & operation,
std::vector< double > & p1_values,
std::vector< double > & p2_values )

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

24{
25 auto p1_scale = numeric_vector_scale_checked(
26 p1, context, operation, &p1_values);
27 auto p2_scale = numeric_vector_scale_checked(
28 p2, context, operation, &p2_values);
29 if (!p1_scale &&
30 (p1_scale.error().code == CasErrc::Cancelled ||
31 p1_scale.error().code == CasErrc::ResourceLimit)) {
32 return Result<double>::failure(p1_scale.error());
33 }
34 if (!p2_scale &&
35 (p2_scale.error().code == CasErrc::Cancelled ||
36 p2_scale.error().code == CasErrc::ResourceLimit)) {
37 return Result<double>::failure(p2_scale.error());
38 }
39 if (!p1_scale || !p2_scale) {
40 return Result<double>::success(0.0);
41 }
42 const double scale = std::max(p1_scale.value(), p2_scale.value());
43 for (size_t i = 0; i < 3; ++i) {
44 if (!std::isfinite(p2_values[i] - p1_values[i])) {
45 return Result<double>::success(scale);
46 }
47 }
48 return Result<double>::success(0.0);
49}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
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)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
__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

引用了 LMCAS::Cancelled, LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::geometry_detail::numeric_vector_scale_checked(), LMCAS::p2, point_difference_scale_checked(), LMCAS::ResourceLimit , 以及 LMCAS::Result< T >::success().

被这些函数引用 point_difference_scale_checked().

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

◆ skew_distance_from_directions()

ExpressionResult LMCAS::anonymous_namespace{symbolic_geometry_line.cpp}::skew_distance_from_directions ( const std::vector< std::shared_ptr< SymbolicExpr > > & direction1,
const std::vector< std::shared_ptr< SymbolicExpr > > & direction2,
const std::vector< std::shared_ptr< SymbolicExpr > > & difference,
double point_scale,
ComputationContext & context,
const std::string & operation )

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

58{
59 auto cross = vector_cross_checked(direction1, direction2, context);
60 if (!cross) return ExpressionResult::failure(cross.error());
61 auto cross_nonzero = checked_nonzero_numeric_vector(
62 cross.value(), context, operation,
63 "skew line distance requires non-parallel directions",
64 "cross-product nonzero condition cannot be verified");
65 if (!cross_nonzero) {
66 return ExpressionResult::failure(cross_nonzero.error());
67 }
68 auto cross_norm_sq = vector_dot_checked(
69 cross.value(), cross.value(), context);
70 if (!cross_norm_sq) {
71 return ExpressionResult::failure(cross_norm_sq.error());
72 }
73 auto cross_norm = SymbolicExpr::sqrt(cross_norm_sq.value());
74 auto numerator = vector_dot_checked(difference, cross.value(), context);
75 if (!numerator) return ExpressionResult::failure(numerator.error());
79 std::vector<std::shared_ptr<const SymbolicNode>>{
80 LMCAS::detail::node(numerator.value())}));
81 auto distance = SymbolicExpr::divide(abs_num, cross_norm);
82 if (point_scale != 0.0) {
83 distance = SymbolicExpr::multiply(
84 distance, SymbolicExpr::number(point_scale));
85 }
86 return simplify_checked(
87 distance, operation,
88 "skew line distance is outside the supported domain", context);
89}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
ExpressionResult simplify_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, ComputationContext &context)
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)
VectorExprListResult vector_cross_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)
ExpressionResult vector_dot_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context)

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

被这些函数引用 skew_distance_from_directions().

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