FreeCAD / tests /src /Base /Placement.cpp
AbdulElahGwaith's picture
Upload folder using huggingface_hub
985c397 verified
#include <gtest/gtest.h>
#include <Base/DualQuaternion.h>
#include <Base/Matrix.h>
#include <Base/Placement.h>
#include <Base/Tools.h>
static const double epsilon = 1e-9;
TEST(Placement, TestDefault)
{
Base::Placement plm;
EXPECT_EQ(plm.getPosition().IsNull(), true);
EXPECT_EQ(plm.getRotation().isNull(), false);
EXPECT_EQ(plm.getRotation().isIdentity(), true);
}
TEST(Placement, TestPosRot)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 1, 2, 2);
Base::Placement plm(pos, rot);
EXPECT_EQ(plm.getPosition(), pos);
EXPECT_EQ(plm.getRotation(), rot);
}
TEST(Placement, TestPosRotCnt)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Vector3d cnt(4, 5, 6);
Base::Placement plm(pos, rot, cnt);
EXPECT_EQ(plm.getPosition(), Base::Vector3d(1, 12, 15));
EXPECT_EQ(plm.getRotation(), rot);
}
TEST(Placement, TestMatrix)
{
Base::Matrix4D mat;
mat.rotX(Base::toRadians(90.0));
mat.rotY(Base::toRadians(90.0));
mat.rotZ(Base::toRadians(90.0));
mat.setCol(3, Base::Vector3d(1, 2, 3));
Base::Placement plm(mat);
EXPECT_EQ(plm.getPosition(), Base::Vector3d(1, 2, 3));
Base::Vector3d axis;
double angle {};
plm.getRotation().getValue(axis, angle);
EXPECT_EQ(angle, Base::toRadians(90.0));
EXPECT_EQ(axis.IsEqual(Base::Vector3d(0, 1, 0), 0.001), true);
}
TEST(Placement, TestIdentity)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Vector3d cnt(4, 5, 6);
Base::Placement plm(pos, rot, cnt);
Base::Placement mult = plm * plm.inverse();
EXPECT_EQ(mult.isIdentity(), true);
}
TEST(Placement, TestInvert)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Vector3d cnt(4, 5, 6);
Base::Placement plm(pos, rot, cnt);
plm.invert();
EXPECT_EQ(plm.getPosition(), Base::Vector3d(-1, 12, 15));
EXPECT_EQ(plm.getRotation().isIdentity(), false);
EXPECT_EQ(plm.getRotation(), rot);
}
TEST(Placement, TestMove)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Vector3d cnt(4, 5, 6);
Base::Placement plm(pos, rot, cnt);
plm.move(Base::Vector3d(-1, -12, -15));
EXPECT_EQ(plm.getPosition().IsNull(), true);
}
TEST(Placement, TestSame)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Vector3d cnt(4, 5, 6);
Base::Placement plm(pos, rot, cnt);
EXPECT_EQ(plm.isSame(plm), true);
EXPECT_EQ(plm.isSame(plm, 0.001), true);
EXPECT_EQ(plm == plm, true);
Base::Placement plm2(plm * plm);
EXPECT_EQ(plm2.isSame(plm), false);
EXPECT_EQ(plm2.isSame(plm, 0.001), false);
EXPECT_EQ(plm2 == plm, false);
}
TEST(Placement, TestMultiply)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Vector3d cnt(4, 5, 6);
Base::Placement plm(pos, rot, cnt);
Base::Placement plm2(plm * plm);
EXPECT_EQ(plm2.getRotation().isIdentity(), true);
}
TEST(Placement, TestMultRight)
{
Base::Vector3d pos1(1, 2, 3);
Base::Rotation rot1(1, 0, 0, 0);
Base::Placement plm1(pos1, rot1);
Base::Vector3d pos2(3, 2, 1);
Base::Rotation rot2(0, 1, 0, 0);
Base::Placement plm2(pos2, rot2);
plm1.multRight(plm2);
EXPECT_EQ(plm1.getRotation(), Base::Rotation(0, 0, 1, 0));
EXPECT_EQ(plm1.getPosition(), Base::Vector3d(4, 0, 2));
}
TEST(Placement, TestMultLeft)
{
Base::Vector3d pos1(1, 2, 3);
Base::Rotation rot1(1, 0, 0, 0);
Base::Placement plm1(pos1, rot1);
Base::Vector3d pos2(3, 2, 1);
Base::Rotation rot2(0, 1, 0, 0);
Base::Placement plm2(pos2, rot2);
plm1.multLeft(plm2);
EXPECT_EQ(plm1.getRotation(), Base::Rotation(0, 0, 1, 0));
EXPECT_EQ(plm1.getPosition(), Base::Vector3d(2, 4, -2));
}
TEST(Placement, TestMultVec)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Placement plm(pos, rot);
Base::Vector3d vec {1, 1, 1};
plm.multVec(vec, vec);
EXPECT_EQ(vec, Base::Vector3d(2, 1, 2));
}
TEST(Placement, TestDualQuat)
{
Base::Vector3d pos(1, 2, 3);
Base::Rotation rot(1, 0, 0, 0);
Base::Placement plm(pos, rot);
Base::DualQuat qq = plm.toDualQuaternion();
Base::Placement plm2 = Base::Placement::fromDualQuaternion(qq);
EXPECT_EQ(plm.isSame(plm2), true);
}
TEST(Placement, TestPow)
{
Base::Vector3d axis1, axis2;
double angle1 {}, angle2 {};
Base::Vector3d pos(1, 4, 6);
Base::Rotation rot(1, 2, 3, 4);
Base::Placement plm(pos, rot);
rot.getValue(axis1, angle1);
Base::Placement plm2 = plm.pow(1.5);
plm2.getRotation().getValue(axis2, angle2);
EXPECT_DOUBLE_EQ(angle2, 1.5 * angle1);
EXPECT_EQ(axis1.IsEqual(axis2, 0.0001), true);
}
TEST(Placement, TestSlerp)
{
Base::Vector3d pos(1, 4, 6);
Base::Rotation rot1(1, 0, 0, 0);
Base::Rotation rot2(0, 1, 0, 0);
Base::Placement plm1(pos, rot1);
Base::Placement plm2(pos, rot2);
Base::Placement plm3 = Base::Placement::slerp(plm1, plm2, 0.0);
EXPECT_EQ(plm3.isSame(plm1), true);
Base::Placement plm4 = Base::Placement::slerp(plm1, plm2, 1.0);
EXPECT_EQ(plm4.isSame(plm2), true);
Base::Placement plm5 = Base::Placement::slerp(plm1, plm1, 0.5);
EXPECT_EQ(plm5.isSame(plm1), true);
Base::Placement plm6 = Base::Placement::slerp(plm1, plm2, 0.5);
EXPECT_EQ(plm6.getRotation().isSame(Base::Rotation(1, 1, 0, 0), epsilon), true);
EXPECT_EQ(plm6.getPosition().IsEqual(pos, epsilon), true);
}
TEST(Placement, TestSclerp)
{
Base::Vector3d pos(1, 4, 6);
Base::Rotation rot1(1, 0, 0, 0);
Base::Rotation rot2(0, 1, 0, 0);
Base::Placement plm1(pos, rot1);
Base::Placement plm2(pos, rot2);
Base::Placement plm3 = Base::Placement::sclerp(plm1, plm2, 0.0);
EXPECT_EQ(plm3.isSame(plm1), true);
Base::Placement plm4 = Base::Placement::sclerp(plm1, plm2, 1.0);
EXPECT_EQ(plm4.isSame(plm2, epsilon), true);
Base::Placement plm5 = Base::Placement::sclerp(plm1, plm1, 0.5);
EXPECT_EQ(plm5.isSame(plm1), true);
Base::Placement plm6 = Base::Placement::sclerp(plm1, plm2, 0.5);
EXPECT_EQ(plm6.getRotation().isSame(Base::Rotation(1, 1, 0, 0), epsilon), true);
EXPECT_EQ(plm6.getPosition().IsEqual(pos, epsilon), true);
}