DIC源码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

520 lines
9.8 KiB

#include "oc_deformation.h"
namespace opencorr
{
//2D deformation with the 1st order shape function
Deformation2D1::Deformation2D1()
{
u = 0.f;
ux = 0.f;
uy = 0.f;
v = 0.f;
vx = 0.f;
vy = 0.f;
setWarp();
}
Deformation2D1::Deformation2D1(float u, float ux, float uy, float v, float vx, float vy)
{
this->u = u;
this->ux = ux;
this->uy = uy;
this->v = v;
this->vx = vx;
this->vy = vy;
setWarp();
}
Deformation2D1::Deformation2D1(float p[6])
{
u = p[0];
ux = p[1];
uy = p[2];
v = p[3];
vx = p[4];
vy = p[5];
setWarp();
}
Deformation2D1::~Deformation2D1() {}
void Deformation2D1::setDeformation(float u, float ux, float uy, float v, float vx, float vy)
{
this->u = u;
this->ux = ux;
this->uy = uy;
this->v = v;
this->vx = vx;
this->vy = vy;
setWarp();
}
void Deformation2D1::setDeformation(float p[6])
{
u = p[0];
ux = p[1];
uy = p[2];
v = p[3];
vx = p[4];
vy = p[5];
setWarp();
}
void Deformation2D1::setDeformation(Deformation2D1& another_deformation)
{
u = another_deformation.u;
ux = another_deformation.ux;
uy = another_deformation.uy;
v = another_deformation.v;
vx = another_deformation.vx;
vy = another_deformation.vy;
setWarp();
}
Point2D Deformation2D1::warp(Point2D& location)
{
Eigen::Vector3f point_vector;
point_vector(0) = location.x;
point_vector(1) = location.y;
point_vector(2) = 1.f;
Eigen::Vector3f warped_vector = warp_matrix * point_vector;
Point2D new_location(warped_vector(0), warped_vector(1));
return new_location;
}
void Deformation2D1::setDeformation()
{
u = warp_matrix(0, 2);
ux = warp_matrix(0, 0) - 1;
uy = warp_matrix(0, 1);
v = warp_matrix(1, 2);
vx = warp_matrix(1, 0);
vy = warp_matrix(1, 1) - 1;
}
void Deformation2D1::setWarp()
{
warp_matrix(0, 0) = 1 + ux;
warp_matrix(0, 1) = uy;
warp_matrix(0, 2) = u;
warp_matrix(1, 0) = vx;
warp_matrix(1, 1) = 1 + vy;
warp_matrix(1, 2) = v;
warp_matrix(2, 0) = 0.f;
warp_matrix(2, 1) = 0.f;
warp_matrix(2, 2) = 1.f;
}
//2D deformation with the 2nd order shape function
Deformation2D2::Deformation2D2()
{
u = 0.f;
ux = 0.f;
uy = 0.f;
uxx = 0.f;
uxy = 0.f;
uyy = 0.f;
v = 0.f;
vx = 0.f;
vy = 0.f;
vxx = 0.f;
vxy = 0.f;
vyy = 0.f;
setWarp();
}
Deformation2D2::Deformation2D2(float u, float ux, float uy, float uxx, float uxy, float uyy,
float v, float vx, float vy, float vxx, float vxy, float vyy)
{
this->u = u;
this->ux = ux;
this->uy = uy;
this->uxx = uxx;
this->uxy = uxy;
this->uyy = uyy;
this->v = v;
this->vx = vx;
this->vy = vy;
this->vxx = vxx;
this->vxy = vxy;
this->vyy = vyy;
setWarp();
}
Deformation2D2::Deformation2D2(float p[12])
{
u = p[0];
ux = p[1];
uy = p[2];
uxx = p[3];
uxy = p[4];
uyy = p[5];
v = p[6];
vx = p[7];
vy = p[8];
vxx = p[9];
vxy = p[10];
vyy = p[11];
setWarp();
}
Deformation2D2::~Deformation2D2() {}
void Deformation2D2::setDeformation(float u, float ux, float uy, float uxx, float uxy, float uyy,
float v, float vx, float vy, float vxx, float vxy, float vyy)
{
this->u = u;
this->ux = ux;
this->uy = uy;
this->uxx = uxx;
this->uxy = uxy;
this->uyy = uyy;
this->v = v;
this->vx = vx;
this->vy = vy;
this->vxx = vxx;
this->vxy = vxy;
this->vyy = vyy;
setWarp();
}
void Deformation2D2::setDeformation(float p[12])
{
u = p[0];
ux = p[1];
uy = p[2];
uxx = p[3];
uxy = p[4];
uyy = p[5];
v = p[6];
vx = p[7];
vy = p[8];
vxx = p[9];
vxy = p[10];
vyy = p[11];
setWarp();
}
void Deformation2D2::setDeformation(Deformation2D2& another_deformation)
{
u = another_deformation.u;
ux = another_deformation.ux;
uy = another_deformation.uy;
uxx = another_deformation.uxx;
uxy = another_deformation.uxy;
uyy = another_deformation.uyy;
v = another_deformation.v;
vx = another_deformation.vx;
vy = another_deformation.vy;
vxx = another_deformation.vxx;
vxy = another_deformation.vxy;
vyy = another_deformation.vyy;
setWarp();
}
void Deformation2D2::setDeformation(Deformation2D1& another_deformation)
{
u = another_deformation.u;
ux = another_deformation.ux;
uy = another_deformation.uy;
uxx = 0.f;
uxy = 0.f;
uyy = 0.f;
v = another_deformation.v;
vx = another_deformation.vx;
vy = another_deformation.vy;
vxx = 0.f;
vxy = 0.f;
vyy = 0.f;
setWarp();
}
Point2D Deformation2D2::warp(Point2D location)
{
Vector6f point_vector;
point_vector(0) = location.x * location.x;
point_vector(1) = location.x * location.y;
point_vector(2) = location.y * location.y;
point_vector(3) = location.x;
point_vector(4) = location.y;
point_vector(5) = 1.f;
Vector6f warped_vector = warp_matrix * point_vector;
Point2D new_location(warped_vector(3), warped_vector(4));
return new_location;
}
void Deformation2D2::setDeformation()
{
u = warp_matrix(3, 5);
ux = warp_matrix(3, 3) - 1.f;
uy = warp_matrix(3, 4);
uxx = warp_matrix(3, 0) * 2.f;
uxy = warp_matrix(3, 1);
uyy = warp_matrix(3, 2) * 2.f;
v = warp_matrix(4, 5);
vx = warp_matrix(4, 3);
vy = warp_matrix(4, 4) - 1.f;
vxx = warp_matrix(4, 0) * 2.f;
vxy = warp_matrix(4, 1);
vyy = warp_matrix(4, 2) * 2.f;
}
void Deformation2D2::setWarp()
{
// row 0, S1 - S6
warp_matrix(0, 0) = 1.f + 2.f * ux + ux * ux + u * uxx;
warp_matrix(0, 1) = 2.f * u * uxy + 2.f * (1.f + ux) * uy;
warp_matrix(0, 2) = uy * uy + u * uyy;
warp_matrix(0, 3) = 2.f * u * (1 + ux);
warp_matrix(0, 4) = 2.f * u * uy;
warp_matrix(0, 5) = u * u;
// row 1, S7 - S12
warp_matrix(1, 0) = 0.5f * (v * uxx + 2.f * (1.f + ux) * vx + u * vxx);
warp_matrix(1, 1) = 1.f + uy * vx + ux * vy + v * uxy + u * vxy + vy + ux;
warp_matrix(1, 2) = 0.5f * (v * uyy + +2.f * uy * (1.f + vy) + u * vyy);
warp_matrix(1, 3) = v + v * ux + u * vx;
warp_matrix(1, 4) = u + v * uy + u * vy;
warp_matrix(1, 5) = u * v;
// row 2, S12 - S18
warp_matrix(2, 0) = vx * vx + v * vxx;
warp_matrix(2, 1) = 2.f * v * vxy + 2.f * vx * (1.f + vy);
warp_matrix(2, 2) = 1.f + 2.f * vy + vy * vy + v * vyy;
warp_matrix(2, 3) = 2.f * v * vx;
warp_matrix(2, 4) = 2.f * v * (1.f + vy);
warp_matrix(2, 5) = v * v;
// row 3
warp_matrix(3, 0) = 0.5f * uxx;
warp_matrix(3, 1) = uxy;
warp_matrix(3, 2) = 0.5f * uyy;
warp_matrix(3, 3) = 1.f + ux;
warp_matrix(3, 4) = uy;
warp_matrix(3, 5) = u;
// row 4
warp_matrix(4, 0) = 0.5f * vxx;
warp_matrix(4, 1) = vxy;
warp_matrix(4, 2) = 0.5f * vyy;
warp_matrix(4, 3) = vx;
warp_matrix(4, 4) = 1.f + vy;
warp_matrix(4, 5) = v;
// row 5
warp_matrix(5, 0) = 0.f;
warp_matrix(5, 1) = 0.f;
warp_matrix(5, 2) = 0.f;
warp_matrix(5, 3) = 0.f;
warp_matrix(5, 4) = 0.f;
warp_matrix(5, 5) = 1.f;
}
//3D deformation with the 1st order shape function
Deformation3D1::Deformation3D1()
{
u = 0.f;
ux = 0.f;
uy = 0.f;
uz = 0.f;
v = 0.f;
vx = 0.f;
vy = 0.f;
vz = 0.f;
w = 0.f;
wx = 0.f;
wy = 0.f;
wz = 0.f;
setWarp();
}
Deformation3D1::Deformation3D1(float u, float ux, float uy, float uz,
float v, float vx, float vy, float vz, float w, float wx, float wy, float wz)
{
this->u = u;
this->ux = ux;
this->uy = uy;
this->uz = uz;
this->v = v;
this->vx = vx;
this->vy = vy;
this->vz = vz;
this->w = w;
this->wx = wx;
this->wy = wy;
this->wz = wz;
setWarp();
}
Deformation3D1::Deformation3D1(float p[12])
{
this->u = p[0];
this->ux = p[1];
this->uy = p[2];
this->uz = p[3];
this->v = p[4];
this->vx = p[5];
this->vy = p[6];
this->vz = p[7];
this->w = p[8];
this->wx = p[9];
this->wy = p[10];
this->wz = p[11];
setWarp();
}
Deformation3D1::~Deformation3D1() {}
void Deformation3D1::setDeformation()
{
u = warp_matrix(0, 3);
ux = warp_matrix(0, 0) - 1;
uy = warp_matrix(0, 1);
uz = warp_matrix(0, 2);
v = warp_matrix(1, 3);
vx = warp_matrix(1, 0);
vy = warp_matrix(1, 1) - 1;
vz = warp_matrix(1, 2);
w = warp_matrix(2, 3);
wx = warp_matrix(2, 0);
wy = warp_matrix(2, 1);
wz = warp_matrix(2, 2) - 1;
}
void Deformation3D1::setDeformation(float u, float ux, float uy, float uz,
float v, float vx, float vy, float vz, float w, float wx, float wy, float wz)
{
this->u = u;
this->ux = ux;
this->uy = uy;
this->uz = uz;
this->v = v;
this->vx = vx;
this->vy = vy;
this->vz = vz;
this->w = w;
this->wx = wx;
this->wy = wy;
this->wz = wz;
setWarp();
}
void Deformation3D1::setDeformation(float p[12])
{
u = p[0];
ux = p[1];
uy = p[2];
uz = p[3];
v = p[4];
vx = p[5];
vy = p[6];
vz = p[7];
w = p[8];
wx = p[9];
wy = p[10];
wz = p[11];
setWarp();
}
void Deformation3D1::setDeformation(Deformation3D1& another_deformation)
{
u = another_deformation.u;
ux = another_deformation.ux;
uy = another_deformation.uy;
uz = another_deformation.uz;
v = another_deformation.v;
vx = another_deformation.vx;
vy = another_deformation.vy;
vz = another_deformation.vz;
w = another_deformation.w;
wx = another_deformation.wx;
wy = another_deformation.wy;
wz = another_deformation.wz;
setWarp();
}
void Deformation3D1::setWarp()
{
warp_matrix(0, 0) = 1 + ux;
warp_matrix(0, 1) = uy;
warp_matrix(0, 2) = uz;
warp_matrix(0, 3) = u;
warp_matrix(1, 0) = vx;
warp_matrix(1, 1) = 1 + vy;
warp_matrix(1, 2) = vz;
warp_matrix(1, 3) = v;
warp_matrix(2, 0) = wx;
warp_matrix(2, 1) = wy;
warp_matrix(2, 2) = 1 + wz;
warp_matrix(2, 3) = w;
warp_matrix(3, 0) = 0.f;
warp_matrix(3, 1) = 0.f;
warp_matrix(3, 2) = 0.f;
warp_matrix(3, 3) = 1.f;
}
Point3D Deformation3D1::warp(Point3D& location)
{
Eigen::Vector4f point_vector;
point_vector(0) = location.x;
point_vector(1) = location.y;
point_vector(2) = location.z;
point_vector(3) = 1.f;
Eigen::Vector4f warped_vector = warp_matrix * point_vector;
Point3D new_location(warped_vector(0), warped_vector(1), warped_vector(2));
return new_location;
}
}//namespace opencorr