• 计算三角形的面积


    计算三角形的面积

    简介:今天比较郁闷,计算平均曲率流使图形光顺的时候,没有成功。(@.@)

    向量求面积

    百度百科链接中的9根据向量求面积

    double vfarea(MyMesh& mesh, MyMesh::VertexHandle vh) {
    	typedef typename MyMesh::Point p_t;
    	typedef typename MyMesh::VertexHandle vh_t;
    	typedef typename MyMesh::HalfedgeHandle hh_t;
    	typename MyMesh::VertexFaceIter vf_it;//点邻接的面
    	typename MyMesh::FaceVertexIter fv_it;//面上的点
    
    	double area = 0.0;
    	for (vf_it = mesh.vf_iter(vh); vf_it.is_valid(); ++vf_it) {//关于点邻接的面
    		fv_it = mesh.fv_iter(*vf_it);//得到面上的点
    
    		const p_t& P = mesh.point(*fv_it);  ++fv_it;
    		const p_t& Q = mesh.point(*fv_it);  ++fv_it;
    		const p_t& R = mesh.point(*fv_it);
    
    		area += ((Q - P) % (R - P)).norm() * 0.5f;//两个向量的叉乘的向量值的一半就是三角形的面积
    	}
    	cout << "[Debug] area is " << area << std::endl;
    	return fabs(area) > std::numeric_limits<double>::min() ? area : 1e-8;
    }
    

    其中有引出OpenMesh的叉乘和点乘

    参考链接 博客园
    其中得知:

    Scalar length() const        //compute euclidean norm 
    Scalar norm() const          //compute euclidean norm 
    

    计算出来的长度就是 sqrt (a*a + b*b + c*c)的长度

    点乘叉乘(内积外积)

    MyMesh::Normal p(1,-3,2), q(0,2,4);
    cout<<"dot product    : "<< (p | q) <<endl;
    cout<<"cross product  : "<< (p % q) <<endl;
    向量 p(x1,y1,z1), q(x2,y2,z2)
    点乘(内积):x1*x2 + y1*y2 + z1*z2
    叉乘(外积):(y1*z2-y2*z1, x2*z1-x1*z2, x1*y2-x2*y1) 
    

    得到
    p | q 是点乘
    p % q 是叉乘

    另外提供一种 海伦公式计算三角形面积的方法

    公式来源惨遭百度百科

    double calcAreaOfThreePoints(const OpenMesh::Vec3f &a, const OpenMesh::Vec3f &b, const OpenMesh::Vec3f &c) {
    	//应用海伦公式   S=1/4sqrt[(a+b+c)(a+b-c)(a+c-b)(b+c-a)]
    	double lenA = sqrt(pow(b[0] - c[0], 2) + pow(b[1] - c[1], 2) + pow(b[2] - c[2], 2));// b - c 两点的坐标
    	double lenB = sqrt(pow(a[0] - c[0], 2) + pow(a[1] - c[1], 2) + pow(a[2] - c[2], 2));// a - c 两点的坐标
    	double lenC = sqrt(pow(b[0] - a[0], 2) + pow(b[1] - a[1], 2) + pow(b[2] - a[2], 2));// a - b 两点的坐标
    	double Area = 1.0 / 4.0 * sqrt((lenA + lenB + lenC) * (lenA + lenB - lenC) * (lenA + lenC - lenB) * (lenB + lenC - lenA));
    	return Area;
    }
    
    Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
  • 相关阅读:
    【Java学习系列】第3课--Java 高级教程
    【夯实PHP基础】nginx php-fpm 输出php错误日志
    【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引
    【架构设计】分布式文件系统 FastDFS的原理和安装使用
    【13】2016.12.13 周二--《小结2016》
    【诗词歌赋】2016.12.15 周四--文言鸿儒《年终的日常》
    【算法】(查找你附近的人) GeoHash核心原理解析及代码实现
    【夯实Nginx基础】Nginx工作原理和优化、漏洞
    【夯实PHP基础】PHP的反射机制
    HTML DOM简易学习笔记
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/11265885.html
Copyright © 2020-2023  润新知