zoukankan      html  css  js  c++  java
  • 计算三角形的面积

    计算三角形的面积

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

    向量求面积

    百度百科链接中的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
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/11265885.html
Copyright © 2011-2022 走看看