几何矩求解椭圆

勒让德惯性椭圆求解

1.matlab利用二阶矩求解椭圆长轴、短轴、离心率、长轴与x轴夹角

xbar=stats(k).Centroid(1);%区域的重心坐标
ybar = stats(k).Centroid(2);


 x = list(:,1) - xbar;
 y = -(list(:,2) - ybar); % This is negative for the
 % orientation calculation (measured in the
 % counter-clockwise direction).

 N = length(x);


 % Calculate normalized second central moments for the region. 1/12 is
  % the normalized second central moment of a pixel with unit length.
  uxx = sum(x.^2)/N + 1/12;%X的二阶矩,即方差
  uyy = sum(y.^2)/N + 1/12;%Y的二阶矩,即方差
  uxy = sum(x.*y)/N;%X,Y的混合二阶矩,协方差

在这里插入图片描述
其中,a,b为长轴和短轴,lanmuda为特征值

% Calculate major axis length, minor axis length, and eccentricity.
   common = sqrt((uxx - uyy)^2 + 4*uxy^2);
    stats(k).MajorAxisLength = 2*sqrt(2)*sqrt(uxx + uyy + common);
    stats(k).MinorAxisLength = 2*sqrt(2)*sqrt(uxx + uyy - common);
    stats(k).Eccentricity = 2*sqrt((stats(k).MajorAxisLength/2)^2 - ...
        (stats(k).MinorAxisLength/2)^2) / ...
         stats(k).MajorAxisLength;

% Calculate orientation
 if (uyy > uxx)
       num = uyy - uxx + sqrt((uyy - uxx)^2 + 4*uxy^2);
       den = 2*uxy;
 else
      num = 2*uxy;
      den = uxx - uyy + sqrt((uxx - uyy)^2 + 4*uxy^2);
 end
 if (num == 0) && (den == 0)
      stats(k).Orientation = 0;
 else
      stats(k).Orientation = (180/pi) * atan(num/den);
end

C++实现:

 void get_LegendreEllipse(vector<Point>&contour, double&major_axis, double&minor_axis)
 {
	 Point2f c;
	 get_centroid(contour, c);
	 int length = contour.size();
	 //求x和y的二阶矩,即方差
	 double uxx = 0, uyy = 0, uxy = 0;
	 for (int i = 0; i < length; i++)
	 {
		 uxx += (contour[i].x - c.x)*(contour[i].x - c.x)/length;
		 uyy += (c.y - contour[i].y)*(c.y - contour[i].y)/length;
		 uxy += (contour[i].x - c.x)*(c.y - contour[i].y)/length;
	 }
	 uxx = uxx+1/12;
	 uyy = uxy+1/12;
	 uxy = uyy;

	 double common = sqrt((uxx - uyy)*(uxx - uyy) + 4 * uxy*uxy);
	 major_axis = 2 * sqrt(2)*sqrt(uxx + uyy + common);
	 minor_axis = 2 * sqrt(2)*sqrt(uxx + uyy - common);

     //离心率
	 double eccentricity = 2 * sqrt((major_axis*major_axis) / 4 - (minor_axis*minor_axis) / 4) / major_axis;
	 cout << eccentricity << endl;

	 //计算与x轴夹角
	 double orientation = 0;
	 double num = 0;
	 double den = 0;
	 if (uyy > uxx)
	 {
		 num = uyy - uxx + sqrt((uyy - uxx)*(uyy - uxx) + 4 * uxy*uxy);
		 den = 2 * uxy;
	 }
	 else {
		 num = 2 * uxy;
		 den = uxx - uyy + sqrt((uxx - uyy)*(uxx - uyy) + 4 * uxy*uxy);
	 }
	 if (num == 0 && den == 0)
	 {
		 orientation = 0;
	 }
	 else {
		 orientation = (180 / PI)*atan(num / den);
	 }
	 //cout << orientation << endl;
 }
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Matlab可以使用PDE Toolbox工具箱来进行椭圆网格划分。椭圆网格划分是将一个区域分割成形或三角形网格的过程。以下是使用Matlab进行椭圆网格划分的一般步骤: 1. 创建描述区域和边界条件的几何体模型。可以使用pdegeom函数定义区域的几何形状,例如椭圆形等。 2. 使用pdecirc函数创建描述具有一定属性的圆形。可以使用该函数为椭圆定义中心坐标和半径。 3. 使用pdeplot函数绘制定义的几何体模型。 4. 创建偏微分方程模型。可以使用创建pde模型的pdecreate函数来定义所需的PDE。可以根据需要设置系数、边界条件等。 5. 生成网格。可以使用pdegrid函数生成网格。可以选择网格类型(例如三角形或形网格)以及控制网格密度和精度的参数。 6. 利用pdesolve函数解决PDE模型。可使用该函数求解初始PDE问题。 7. 可以使用pdeinterp函数在已生成的网格上对解进行插值。 8. 使用pdeplot函数绘制解决方案。 总之,Matlab通过PDE Toolbox提供了用于椭圆网格划分的各种功能和函数,使得进行椭圆网格划分变得相对简单和直观。可以根据需要使用这些函数来定义几何体形状、设置PDE系数、边界条件等,然后生成和解决相应的椭圆网格问题,并可视化结果。 ### 回答2: Matlab中的椭圆网格划分是一种用于将椭圆形区域划分为适当大小和形状的小网格单元的方法。这种方法对于许多科学和工程应用中涉及到椭圆形区域的数值计算问题非常有用。 在Matlab中,通过使用`pdequal`函数可以进行椭圆网格划分。该函数需要给定椭圆几何特征,如椭圆的半长轴和半短轴的长度,以及希望划分的网格单元数量。使用这些参数,`pdequal`函数将生成一个包含适当大小和形状的小网格单元的网格。 椭圆网格划分对于求解椭圆型偏微分方程(如Poisson方程、椭圆型边值问题等)非常有用。它提供了一个基于有限元方法的工具,可以将椭圆形区域划分为适合数值计算的小单元。这些小单元可以用来近似解的连续性,并在计算中提供离散化后的问题。 使用Matlab进行椭圆网格划分可以为使用有限元方法求解椭圆型偏微分方程的工程师和科学家提供方便和效率。它为他们提供了一个直观的工具,可以根据需要灵活地调整网格单元的大小和形状。这对于获得更准确的数值解以及更高效的计算过程非常重要。 总而言之,Matlab中的椭圆网格划分是一种用于将椭圆形区域划分为适当大小和形状的小网格单元的方法。这种方法在求解椭圆型偏微分方程等问题时非常有用,并为科学家和工程师提供了一个灵活且高效的工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月醉窗台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值