feat: Bezier 解析导数 + 测试补充 + 区间算术验证
- curves/bezier: 重写导数(前向差分 + de Casteljau) - curves/bezier_surface: de Casteljau 解析导数 du/dv - tests/bezier: 新增导数/分割测试 (5 cases) - foundation/interval: 区间算术 + orient2d 验证函数
This commit is contained in:
@@ -3,16 +3,35 @@
|
||||
|
||||
using namespace vde::curves;
|
||||
|
||||
TEST(BezierTest, Linear_EvaluateAtMidpoint) {
|
||||
TEST(BezierTest, LinearEvaluateAtMidpoint) {
|
||||
BezierCurve curve({Point3D(0,0,0), Point3D(2,0,0)});
|
||||
Point3D p = curve.evaluate(0.5);
|
||||
EXPECT_NEAR(p.x(), 1.0, 1e-6);
|
||||
}
|
||||
|
||||
TEST(BezierTest, Quadratic_EvaluateAtEndpoints) {
|
||||
TEST(BezierTest, QuadraticEvaluateAtEndpoints) {
|
||||
BezierCurve curve({Point3D(0,0,0), Point3D(1,1,0), Point3D(2,0,0)});
|
||||
Point3D p0 = curve.evaluate(0.0);
|
||||
Point3D p1 = curve.evaluate(1.0);
|
||||
EXPECT_NEAR((p0 - Point3D(0,0,0)).norm(), 0.0, 1e-6);
|
||||
EXPECT_NEAR((p1 - Point3D(2,0,0)).norm(), 0.0, 1e-6);
|
||||
EXPECT_NEAR((curve.evaluate(0.0) - Point3D(0,0,0)).norm(), 0.0, 1e-6);
|
||||
EXPECT_NEAR((curve.evaluate(1.0) - Point3D(2,0,0)).norm(), 0.0, 1e-6);
|
||||
}
|
||||
|
||||
TEST(BezierTest, LinearDerivative) {
|
||||
BezierCurve curve({Point3D(0,0,0), Point3D(2,0,0)});
|
||||
Vector3D d = curve.derivative(0.5, 1);
|
||||
EXPECT_NEAR(d.x(), 2.0, 1e-6);
|
||||
EXPECT_NEAR(d.y(), 0.0, 1e-6);
|
||||
}
|
||||
|
||||
TEST(BezierTest, QuadraticDerivative) {
|
||||
BezierCurve curve({Point3D(0,0,0), Point3D(1,2,0), Point3D(3,0,0)});
|
||||
Vector3D d = curve.derivative(0.5, 1);
|
||||
EXPECT_GT(d.norm(), 0.0);
|
||||
}
|
||||
|
||||
TEST(BezierTest, Split) {
|
||||
BezierCurve curve({Point3D(0,0,0), Point3D(2,0,0)});
|
||||
auto [c1, c2] = curve.split(0.5);
|
||||
EXPECT_EQ(c1.degree(), 1);
|
||||
EXPECT_EQ(c2.degree(), 1);
|
||||
EXPECT_NEAR((c1.evaluate(1.0) - Point3D(1,0,0)).norm(), 0.0, 1e-6);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user