ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
vde::sketch::ConstraintSolver类 参考

二维几何约束求解器 更多...

#include <constraint_solver.h>

Public 成员函数

int add_point (double x, double y, bool fixed=false)
 添加自由点 更多...
 
int add_line (int p0, int p1)
 添加线段 更多...
 
int add_circle (int center, double radius)
 添加圆 更多...
 
void add_constraint (ConstraintType type, const std::vector< int > &elements, double val=0.0)
 添加约束 更多...
 
void fix_point (int pid)
 标记点为固定(硬约束) 更多...
 
SolverResult solve (int max_iter=100, double tol=1e-8)
 执行约束求解 更多...
 
int degrees_of_freedom () const
 计算自由度 更多...
 
const std::vector< SketchPoint > & points () const
 当前点集访问 更多...
 
Point2D get_point (int id) const
 查询点坐标 更多...
 

详细描述

二维几何约束求解器

基于 Gauss-Newton 非线性最小二乘的 2D 草图约束求解器。 支持点、线段、圆元素的水平/垂直/平行/垂直/相切/距离/角度等约束。

求解流程:

  1. 构建变量向量(非固定点的 x,y 坐标)
  2. 对每个约束方程计算残差向量 r(x)
  3. 数值 Jacobian J = ∂r/∂x(中心差分)
  4. Gauss-Newton 步:Δx = -(J^T J)^{-1} J^T r
  5. x ← x + Δx,重复直到收敛或 max_iter

自由度分析: DOF = 2·N_free_points - Σ(约束方程数) DOF > 0 → 欠约束(解不唯一) DOF = 0 → 恰定(应有唯一解) DOF < 0 → 过约束(最小二乘意义下求解)

ConstraintSolver solver;
int p0 = solver.add_point(0, 0); // 原点
int p1 = solver.add_point(100, 0);
int p2 = solver.add_point(100, 50);
solver.add_line(p0, p1); // 底边
solver.fix_point(p0); // 原点固定
solver.add_constraint(ConstraintType::Horizontal, {p0, p1});
solver.add_constraint(ConstraintType::Distance, {p0, p2}, 100.0);
auto result = solver.solve();
if (result.converged) {
auto p = result.points;
}
@ Distance
距离约束: |p1-p0| - d = 0 [1 eq]
@ Horizontal
水平线: y1 - y0 = 0 [1 eq]

在文件 constraint_solver.h124 行定义.

成员函数说明

◆ add_circle()

int vde::sketch::ConstraintSolver::add_circle ( int  center,
double  radius 
)

添加圆

参数
center圆心点 ID
radius半径
返回
圆 ID

◆ add_constraint()

void vde::sketch::ConstraintSolver::add_constraint ( ConstraintType  type,
const std::vector< int > &  elements,
double  val = 0.0 
)

添加约束

参数
type约束类型
elements约束涉及的元素 ID 列表
val约束值(距离、角度等),默认 0
注解
不同类型 elements 的语义: Horizontal/Vertical: {p0, p1} Parallel/Perpendicular: {l0_p0, l0_p1, l1_p0, l1_p1} Distance: {p0, p1}, val = 距离 Angle: {l0_p0, l0_p1, l1_p0, l1_p1}, val = 角度(度) Radius: {circle_id}, val = 半径 Tangent: {line_p0, line_p1, circle_id} Coincident: {p0, p1}

◆ add_line()

int vde::sketch::ConstraintSolver::add_line ( int  p0,
int  p1 
)

添加线段

参数
p0起点 ID
p1终点 ID
返回
线段 ID

◆ add_point()

int vde::sketch::ConstraintSolver::add_point ( double  x,
double  y,
bool  fixed = false 
)

添加自由点

参数
xX 坐标
yY 坐标
fixed是否固定(true 则排除变量)
返回
点 ID

◆ degrees_of_freedom()

int vde::sketch::ConstraintSolver::degrees_of_freedom ( ) const

计算自由度

返回
DOF = 2·N_free - Σ(约束方程数)
注解
DOF < 0 时系统过约束,求解器仍然工作但解非精确满足所有约束

◆ fix_point()

void vde::sketch::ConstraintSolver::fix_point ( int  pid)
inline

标记点为固定(硬约束)

参数
pid点 ID
注解
固定点不参与变量优化,从自由度中排除

在文件 constraint_solver.h173 行定义.

◆ get_point()

Point2D vde::sketch::ConstraintSolver::get_point ( int  id) const

查询点坐标

参数
id点 ID
返回
Point2D 当前坐标

◆ points()

const std::vector<SketchPoint>& vde::sketch::ConstraintSolver::points ( ) const
inline

当前点集访问

返回
SketchPoint 数组只读引用

在文件 constraint_solver.h201 行定义.

◆ solve()

SolverResult vde::sketch::ConstraintSolver::solve ( int  max_iter = 100,
double  tol = 1e-8 
)

执行约束求解

参数
max_iter最大 Gauss-Newton 迭代次数,默认 100
tol收敛容差(梯度范数 < tol 时停止),默认 1e-8
返回
SolverResult 求解结果
注解
收敛判断:||J^T r|| < tol
欠约束时(DOF > 0)解不唯一;过约束时(DOF < 0)为最小二乘解

该类的文档由以下文件生成: