目录
1、直线方程
2、直线和平面的交点
3、三角形线性插值
已知直线上一点和直线的方向向量或者法向量,求直线方程
已知直线一点L和直线的方向向量l、平面上一点P和平面的法向量p,求直线与平面的交点
======================
上面线面的交点部分应该写错了,暂时没时间修改,下面是验证代码,后面有时间再校验吧
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;
}
======================
【注意】最好使用方法二的面积计算,误差很小,方法一误差比较大
验证一下上面两种插值方法的不同
#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;
}
使用面积插值法的话更接近于理想状态的线性