C++&OpenCV:三角形插值、线面的交点

目录

1、直线方程

2、直线和平面的交点

3、三角形线性插值


1、直线方程

已知直线上一点和直线的方向向量或者法向量,求直线方程

C++&OpenCV:三角形插值、线面的交点_第1张图片

2、直线和平面的交点

已知直线一点L和直线的方向向量l、平面上一点P和平面的法向量p,求直线与平面的交点

C++&OpenCV:三角形插值、线面的交点_第2张图片

======================

上面线面的交点部分应该写错了,暂时没时间修改,下面是验证代码,后面有时间再校验吧

Vec3f Line1 = Vec3f(0, 0, 0);//直线起点
Vec3f Line2 = Vec3f(1, 1, 1);//直线终点
Vec3f P1 = Vec3f(0, 10, 0);//面上一点
Vec3f PNorm = Vec3f(0, 1, 0);//面法向量

int main()
{
	Vec3f LDir = Line2 - Line1;
	float den = PNorm.dot(LDir);//面法向量乘线方向向量
	float t = PNorm.dot(P1-Line1) / den;
	Vec3f output = Line1 + LDir * t;
	cout << output << endl;
	return 1;
}

====================== 

3、三角形线性插值

【注意】最好使用方法二的面积计算,误差很小,方法一误差比较大 

C++&OpenCV:三角形插值、线面的交点_第3张图片

验证一下上面两种插值方法的不同

#include 
#include 
#include 
using namespace cv;
using namespace std;

int main(int argc, char** crgv) {
    //三角形的三个点
    vector vertice_pos;
    vertice_pos.push_back(Vec3d(1, 0, 0));
    vertice_pos.push_back(Vec3d(4, 0, 0));
    vertice_pos.push_back(Vec3d(2, 3, 0));
    cout << "三角形的三个点分别为:\n" << vertice_pos[0] << "\n" << vertice_pos[1] << "\n" << vertice_pos[2] << endl;
    Vec3d df0, df1, pk,dk0,dk1,dk2,tc;
    double tri_area, tri_area0, tri_area1, tri_area2,r0,r1,r2;

    //三角形内某点
    pk[0] = 2;
    pk[1] = 1;
    pk[2] = 0;
    cout << "三角形内的一点为:\n" << pk << endl;

    //大三角形围成的平行四边形的面积
    df0 = vertice_pos[1] - vertice_pos[0];
    df1 = vertice_pos[2] - vertice_pos[0];
    tri_area = cv::norm(df0.cross(df1));//叉积是个向量,二范数的模就是围成的平行四边形的面积

    //三个小三角形围成的平行四边形的面积
    dk0 = pk - vertice_pos[0];
    dk1 = pk - vertice_pos[1];
    dk2 = pk - vertice_pos[2];

    tri_area0 = cv::norm(dk1.cross(dk2));//三个分量的面积
    tri_area1 = cv::norm(dk0.cross(dk2));
    tri_area2 = cv::norm(dk0.cross(dk1));

    //============1===================
    r0 = tri_area0 / tri_area;//权重
    r1 = tri_area1 / tri_area;
    r2 = tri_area2 / tri_area;
    cout << "=======使用面积计算==========" << endl;
    cout <<"权重分别为:\n"<< r0 << "\n" << r1 << "\n" << r2 << endl;

    tc = r0 * vertice_pos[0] + r1 * vertice_pos[1] + r2 * vertice_pos[2];
    cout <<"使用插值重新计算三角形内的该点坐标:\n"<< tc << endl;
    //============2===================
    double l0, l1, l2,lsum;
    lsum = 1/cv::norm(dk0) + 1 / cv::norm(dk1) + 1 / cv::norm(dk2);
    l0 = 1 / cv::norm(dk0) / lsum;
    l1 = 1 / cv::norm(dk1) / lsum;
    l2 = 1 / cv::norm(dk2) / lsum;
    cout << "=======使用距离计算==========" << endl;
    cout << "权重分别为:\n" << l0 << "\n" << l1 << "\n" << l2 << endl;
    tc = l0 * vertice_pos[0] + l1 * vertice_pos[1] + l2 * vertice_pos[2];
    cout << "使用插值重新计算三角形内的该点坐标:\n" << tc << endl;
	return 0;
}

C++&OpenCV:三角形插值、线面的交点_第4张图片

使用面积插值法的话更接近于理想状态的线性 

你可能感兴趣的:(C++,opencv,opencv,c++)