MoM(二)

一、计算单元面积

1、原理

利用向量的思想,S=\frac{1}{2}\begin{vmatrix} i & j&k \\ x_{1} &y_{1} &z_{1} \\ x_{2}&y_{2} &z_{2} \end{vmatrix}=\frac{1}{2}AB \times AC

其中,(x_{1},y_{1},z_{1})(x_{2},y_{2},z_{2})分别为向量ABAC在空间直角坐标系下的坐标表达,即:向量构成三角形面积等于向量构成平行四边形面积的一半

即三角型的面积是四边形面积的一半

2、重难点

写代码的时候,发现函数不能返回数组,所以在这记一下。

1、使用指针

int* fun(int x1[3], int x2[3])
{
    int* x3 = new int[3];

    x3[0] = x1[0] + x2[0];
    x3[1] = x1[1] + x2[1] ;
    x3[2] = x1[2] + x2[2] ;

    return x3;
}

int main()
{
   int x1[3] = { 1,2,3 };
   int x2[3] = { 5,6,7 };
   int* x3 = new int[3];
   x3 = fun(x1, x2);
   for (int i = 0; i < 3; i++) {
       cout << x3[i] << '\t';
   }
   delete[] x3;   //必不可少
}
  

2、使用 static 

int* fun(int x1[3], int x2[3])
{
    //int* x3 = new int[3];
    static int x3[3];
    x3[0] = x1[0] + x2[0];
    x3[1] = x1[1] + x2[1] ;
    x3[2] = x1[2] + x2[2] ;

    return x3;
}

int main()
{
   int x1[3] = { 1,2,3 };
   int x2[3] = { 5,6,7 };
   //int* x3 = new int[3];
   int *x3;
   x3 = fun(x1, x2);
   for (int i = 0; i < 3; i++) {
       cout << x3[i] << '\t';
   }
}

3、代码

/*向量叉乘运算*/
double* cross(double x1[3], double x2[3])
{
	double* x3 = new double[3];
	x3[0] = x1[1] * x2[2] - x1[2] * x2[1];
	x3[1] = x1[2] * x2[0] - x1[0] * x2[2];
	x3[2] = x1[0] * x2[1] - x1[1] * x2[0];
	return x3;
}
/*计算每个三角片面的面积*/
void area()
{
	vec area(elem_num);
	mat center(elem_num, 3);
	double vector1[3], vector2[3];   //两向量
	double * vector3 = new double[3]; //叉乘结果
	for (int i = 0; i < elem_num; i++) {
		for (int j = 0; j < 3; j++) {
			vector1[j] = element_list.slice(i)(0, j) - element_list.slice(i)(1, j);
			vector2[j] = element_list.slice(i)(2, j) - element_list.slice(i)(1, j);
		}
		vector3 = cross(vector1, vector2); 
		area(i) = 0.5 * sqrt(pow(vector3[0], 2) + pow(vector3[1], 2) + pow(vector3[2], 2));
		/*center(i, 0) = (1.0 / 3.0) * (element_list.slice(i)(0, 0) + element_list.slice(i)(1, 0) + element_list.slice(i)(2, 0));
		center(i, 1) = (1.0 / 3.0) * (element_list.slice(i)(0, 1) + element_list.slice(i)(1, 1) + element_list.slice(i)(2, 1));
		center(i, 2) = (1.0 / 3.0) * (element_list.slice(i)(0, 2) + element_list.slice(i)(1, 2) + element_list.slice(i)(2, 2));*/
		for (size_t k = 0; k < 3; k++) {
			center(i, k) = (1.0 / 3.0) * (element_list.slice(i)(0, k) + element_list.slice(i)(1, k) + element_list.slice(i)(2, k));
		}
	}
	delete[] vector3;
	Area = area;
	Center = center;
}

二、求公共边的长度

/*寻找组成公共边的两个点 以及 非公共边的点*/
void commonEdge() {
	mat commonEdge_p(rwg_num, 2);
	mat commonEdge_n(rwg_num, 2);
	vec vertex_pos(rwg_num);
	vec vertex_nega(rwg_num);
	for (int i = 0; i < rwg_num; i++) {
		int t = 0;
		for (int m = 0; m < 3; m++) {
			for (int n = 0; n < 3; n++) {
				//slice 选层,即选 element    (basis_list 里面是配对了的两个 element)
			// (m,0)  m:组成element的第m个点   0:x坐标   1:y坐标  2:z坐标
				if (element_list.slice(basis_list(i, 0))(m, 0) == element_list.slice(basis_list(i, 1))(n, 0) &&
					element_list.slice(basis_list(i, 0))(m, 1) == element_list.slice(basis_list(i, 1))(n, 1) &&
					element_list.slice(basis_list(i, 0))(m, 2) == element_list.slice(basis_list(i, 1))(n, 2))
				{
					commonEdge_p(i, t) = m;
					commonEdge_n(i, t) = n;
					t++;
				}
				//if (t > 2) break;
			}
			if (t > 2) {
				printf("相同点数大于2,退出");
				break;
			}
		}
		for (int k = 0; k < 3; k++) {
			if (k != commonEdge_p(i,0) && k != commonEdge_p(i,1)) {
				vertex_pos(i) = k;
			}
			if (k != commonEdge_n(i, 0) && k != commonEdge_n(i, 1)) {
				vertex_nega(i) = k;
			}
		}

		//if (t > 2) break;
	}
	CommonEdgeP = commonEdge_p;
	CommonEdgeN = commonEdge_n;
	Vertex_pos = vertex_pos;
	Vertex_naga = vertex_nega;
}
void edgelength()
{
	commonEdge();
	vec edgeLength(rwg_num);
	rowvec vector1(1, 3), vector2(1, 3), vector3(1, 3);
	for (int i = 0; i < rwg_num; i++) {
		// 取出 被定义为正的element 的编号
		int NoPos = basis_list(i, 0);
		vector1 = element_list.slice(NoPos).row(CommonEdgeP(i, 0)) - element_list.slice(NoPos).row(CommonEdgeP(i, 1));
		edgeLength(i) = sqrt(as_scalar(vector1 * strans(vector1)));
	}
	EdgeLength = edgeLength;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值