从bspline中提取圆弧/圆定义

时间:2016-02-10 08:35:19

标签: python geometry cad step bspline

我必须解码STEP cad文件,其中可以将3d圆定义为样条曲线。 我希望能够解码样条曲线是弧形或圆形。

首先我有步骤B_SPLINE_CURVE_WITH_KNOTS元素。

var configHeader = {
  headers: {
    'Authorization': 'xxxxxx'
  }
};

$http.post(url, configHeader).then(function(response) {
  //do something 
});

所以,如果我是对的,我解读了:
58个控制点
29节结果 29节
学位3 closed_curve参数= True

现在,我们的想法是将它转换为贝塞尔曲线以便找到弧/圆,但我被困在这些参数前面。

4 个答案:

答案 0 :(得分:2)

每个内部结具有多重性= 2.这意味着样条曲线为C_1,并且与控制多边形的腿相切。具体来说,如果t[i-1]t[i]t[i+1}是三个节点,每个节点具有多重性= 2,那么样条曲线与控制多边形腿相切,在该点处以比例划分腿
 t[i+1] - t[i] : t[i] - t[i-1]。在下图中,这些相切点显示为空心圆,红色圆圈为控制点:

enter image description here

事实上,在您的特定示例中,结间间距是均匀的,在大多数情况下 - 很多情况下t[i+1] - t[i] = t[i] - t[i-1] = 0.000391。这意味着在许多地方,样条曲线与控制多边形的一条腿在其中点处相切。

使用控制点和相切点,您可以计算终点( P Q )和单位长度末端切线( U < / strong>和 V )。每个立方段

enter image description here

然后,一个小三角法和矢量算法将为您提供相应圆的半径和中心。示例伪代码如下。它假设一些明显的向量函数,并且它避免使用trig函数:

// Input:
// P: start point
// Q: end point
// U: start tangent (assumed to be of unit length)
// V: end   tangent (assumed to be of unit length)

Vector C = Q - P;    // chord vector

// Test that tangent vectors make same angle with chord
double UdotC = U*C;      
double VdotC = V*C;         
double epsilon = some small number, say around 0.000001;
if (Math.Abs(UdotC - VdotC) > epsilon) throw;  // Tangents not symmetric

// Test that tangents and chord are coplanar
Vector UcrossC = Vector.Cross(U, C);  
double det = V*UcrossC;
if (det > epsilon) throw;   // Tangents and chord not coplanar

double CdotC = C*C;
double radius = 0.5 * CdotC / Vector.Norm(UcrossC);

double c2 = (UdotC*UdotC)/CdotC;
Vector dW = 0.25*(UdotC/(1-c2))*(V - U);
Position center = P + 0.5*C + dW;

如果你用这种方式创建的圆具有相等的中心和半径(在一定的合理公差范围内),那么假设样条曲线的“意图”是圆圈是相当安全的。

我认为以这种方式使用点和切线比将样条拟合到样条曲线上的任意点要好。发送系统中的代码很可能通过所谓的“Hermite”方法(使用点和切线)构造样条。如果是这种情况,那么上面计算的点和切线很可能与原始圆(如果有的话)完全匹配。样条上任意计算的点不会完全位于原始圆上,因此会遇到更多的公差问题。

答案 1 :(得分:0)

你可以计算arc through 3 consecutive knots。如果bspline的所有三元组的弧都是常数,则曲线本身就是弧。

答案 2 :(得分:0)

圆弧或整圆不能用积分B样条曲线精确表示。因此,如果您确定STEP文件中的B样条曲线不合理,那么它仅表示弧或整圆。如果是这种情况,您可以执行以下操作:

  • 在B样条曲线上采样一些点,
  • 对采样点进行最小二乘拟合,以获得最佳拟合圆和与每个采样点相关的偏差。
  • 如果最大偏差小于某个阈值,则获得圆/弧。否则,此B样条曲线不是圆/弧。

无论您是否具有合理或整数B样条曲线,此方法都将起作用。

答案 3 :(得分:0)

首先,主要问题是理解STEP BSPLINE_CURVE_WITH_KNOTS定义:

knot_multicplicites =(4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 2,2,2,2,2,4)

结=(0.0000000000000000000,0.0003907630664662950000,0.0007815261329325900100,0.001172289199398885000,0.001563052265865180000,0.002344578398797811600,0.003126104531730443300,0.003516867598196761600,0.003907630664663080300,0.004298393731129399400,0.004689156797595717700,0.005079919864062035900,0.005470682930528354200,0.005861445996994673300,0.006252209063460992400,0.006642972129927311600,0.007033735196393629000,0.007815261329326231600,0.008206024395792531700,0.008596787462258833500,0.008987550528725133500,0.009378313595191433600, 0.009769076661657735300,0.01015983972812403500,0.01055060279459033500,0.01094136586105663500,0.01133212892752293700,0.01172289199398923700,0.01250441812692185600)

我认为这意味着结必须解码为:

(0.000000000000000000,0.000000000000000000,0.000000000000000000,0.000000000000000000, 0.0003907630664662950000,0.0003907630664662950000, 0.0007815261329325900100,0.0007815261329325900100 ....

但令我担心的是,多重性(4)大于程度:3!