CubicBézier:当领先系数为零时该怎么办?

时间:2015-08-03 15:52:26

标签: c++ math bezier

我使用一种相当标准的方法从三次Bézier曲线的控制点检索monic多项式系数:

std::array<double, 3> getBezierCubicCoefficients( const std::array<double, 4>& bezier )
{
    const auto d = 1.0 / ( bezier[3] - 3*bezier[2] + 3*bezier[1] - bezier[0] );
    return { ( 3*bezier[2] - 6*bezier[1] + 3*bezier[0] ) * d,
             ( 3*bezier[1] - 3*bezier[0] ) * d,
             bezier[0] * d };
}

这在99%的情况下工作正常,但正如您可能猜到的那样,在某些坐标下失败会导致d的除数计算为零 - 导致d求值为{{1 }}

我的问题是:在这种情况下该怎么做?

我是否真的伪装成二次曲线,我应该改为降低程度吗?我应该只是捏造数字Inf非常大,但不会导致d? (我真的希望这不是答案)。

1 个答案:

答案 0 :(得分:2)

正如您可能已经知道的那样,可以通过乘以下面的矩阵从贝塞尔系数计算单子系数Private Sub GroupCommandRtime() Dim list As String() = rtbComData.Text.Split(Environment.NewLine.ToCharArray())`enter code here` Dim ListaAdrese As List(Of String) = GetAdreseID() For Each Row As String In list For Each _Adresa As String In ListaAdrese If Not (Row = "at+remote=" Or Row = "AT+RSSI" Or Row = "OK") Then Try Dim s As String() = Split(Row, " ") Dim con As New SqlConnection Dim cmd As New SqlCommand con.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database\smdData.mdf;Integrated Security=True;User Instance=True" con.Open() cmd.Connection = con cmd.CommandText = "UPDATE smdTable SET datetime='" + s(3) + "' WHERE AdresaUnica = '" + s(0) + "'" cmd.ExecuteNonQuery() Me.SmdTableTableAdapter.Fill(Me.SmdDataDataSet1.smdTable) DataGridView1.Refresh() Catch ex As Exception End Try End If Next Next End Sub

c

如果结果 / 1 -3 3 -1 \ | 3 -6 3 | (c0 c1 c2 c3) = (b0 b1 b2 b3) | 3 -3 | \ 0 1 / 为零,那么您将获得二次多项式(最多)。在退化情况下,其他系数也可以产生c3 = -b0 + 3b1 - 3b2 + b3。在边缘情况下,最终得到一个常数。