首页 > 其他分享 >已知椭圆长轴,短轴,圆心,旋转角度求任意椭圆外包矩形

已知椭圆长轴,短轴,圆心,旋转角度求任意椭圆外包矩形

时间:2024-02-27 20:13:35浏览次数:14  
标签:平移 椭圆 double 短轴 圆心 rotation ref Math

参考:https://blog.csdn.net/fangmin723/article/details/118595271
参考:https://blog.csdn.net/liuxiang3/article/details/114258907

一、已知椭圆长轴,短轴,圆心,旋转角度求椭圆(旋转未做平移)方程一般式:

一般来说,椭圆可以以任何一点为中心,也可以有与坐标轴不平行的轴。这样的椭圆总是可以从标准位置的椭圆开始,然后进行旋转和/或平移得到。对于一般性的公式,我们可以包括通过一个角度为0的旋转(即根本没有旋转)和通过零向量的平移(根本没有平移)来进行变换。也就是说,每一个椭圆都可以通过在标准位置上旋转和平移得到。因此,对椭圆的标准方程进行旋转和平移,可以得到任意椭圆的方程。
是旋转然后平移,还是相反,这是一个需要选择的问题。为了理解这个,让R表示一个旋转,考虑点x = ( x , y ) x=(x,y)x=(x,y),会发生什么如果我们先平移向量v vv,然后应用 R RR。因为R RR是线性的,变换之后的结果为R ( x + v ) = R x + R v R(x+v)=Rx+RvR(x+v)=Rx+Rv,然而这和先旋转x xx,然后用R v RvRv平移是一样的。这表明,每一个椭圆都可以从一个标准位置的椭圆中得到,要么是旋转后再平移,要么是平移后再旋转。在推导椭圆的一般方程时,我们将使用先旋转后平移的方法。
参考旋转矩阵的两种用法一文,我们使用极坐标工具,绕原点逆时针旋转,通过一个角α αα,很容易可以将( x , y ) (x,y)(x,y)变成( x c o s α − y s i n α , y c o s α + x s i n α ) (xcosα-ysinα,ycosα+xsinα)(xcosα−ysinα,ycosα+xsinα)。写成矩阵的形式为:

然后,再次使用坐标旋转变换公式,即可得到椭圆的长短轴信息,参考Rotated Conic Section Identifying这个视频

二、上述基础上,增加平移向量,方程一般式为:

三、上述基础上增加平移向量,方程一般式为:
1.构造关于x的二元一次方程式:

2.令△=0,构造关于y的二元一次方程组,求得y值为Y最大和最小值。

构造关于y的二元一次方程式,

令△=0,构造关于x的二元一次方程组,求得x值为x最大和最小值。

四、代码实现

static void Main(string[] args)
{
    double maxX = 0, minX = 0, maxY = 0, minY = 0;
    CalcEllipseRect(0.4254, 2.1152, 0, 201.7681, 163.9117, ref maxX, ref minX, ref maxY, ref minY);
    CalcEllipseRect(0.4254, 2.1152, (Math.PI * 3.0 / 4.0 + Math.PI / 6.0), 201.7681, 163.9117, ref maxX, ref minX, ref maxY, ref minY);
    CalcEllipseRect(3.86555, 10.7108, (Math.PI / 4.0), -0.8859, 7.57, ref maxX, ref minX, ref maxY, ref minY);
    Console.WriteLine($"maxX {maxX}, minX {minX}, maxY {maxY}, minY {minY}");
}

/// <summary>
/// 计算椭圆外包矩形
/// </summary>
/// <param name="minorAxis">短轴半径</param>
/// <param name="majorAxis">长轴半径</param>
/// <param name="rotation">旋转角度(弧度)</param>
/// <param name="centerX">椭圆圆心X</param>
/// <param name="centerY">椭圆圆心Y</param>
/// <param name="maxX"></param>
/// <param name="minX"></param>
/// <param name="maxY"></param>
/// <param name="minY"></param>
/// <returns></returns>
static bool CalcEllipseRect(double minorAxis, double majorAxis, double rotation, double centerX, double centerY,
    ref double maxX, ref double minX, ref double maxY, ref double minY)
{
    //计算椭圆方程旋转(未平移)一般式:Ax²+Bxy+Cy²=1。中A,B,C
    double cosA = Math.Cos(rotation);
    double sinA = Math.Sin(rotation);
    double test = (double)(Math.Cos(rotation) * Math.Cos(rotation));
    double test2 = majorAxis * majorAxis;
    double test3 = minorAxis * minorAxis;
    double test4 = (double)(Math.Sin(rotation) * Math.Sin(rotation));
    double test5 = test / test2 + test4 / test3;
    double A = (Math.Cos(rotation) * Math.Cos(rotation)) / (majorAxis * majorAxis) + (Math.Sin(rotation) * Math.Sin(rotation)) / (minorAxis * minorAxis);
    double B = 2 * Math.Cos(rotation) * Math.Sin(rotation) * (1.0 / (majorAxis * majorAxis) - 1.0 / (minorAxis * minorAxis));
    double C = (Math.Sin(rotation) * Math.Sin(rotation)) / (majorAxis * majorAxis) + (Math.Cos(rotation) * Math.Cos(rotation)) / (minorAxis * minorAxis);

    //计算椭圆方程增加平移(椭圆中心坐标,即向量(P,Q))后的一般式:Ax² + Bxy + Cy²−(2AP + BQ)x−(2CQ + BP)y + (AP²+ BPQ + CQ²−1)= 0
    double P = centerX;
    double Q = centerY;

    //关于X的二元一次方程:Ax² + (By-2AP-QB)x + Cy²-(2CQ + BP)y +  (AP²+ BPQ + CQ²−1)= 0
    //令δ=0,b²-4ac 则得到关于y公式:(B²-4AC)y²+[4A2CQ + 4ABP-2B(2AP+BQ)]y+(2AP+BQ)²-4A(AP²+ BPQ + CQ²−1) = 0;
    //求解y:

    double a = B * B - 4 * A * C;
    double b = 4 * A * 2 * C * Q + 4 * A * B * P - 2 * B * (2 * A * P + B * Q);
    double c = (2*A*P + B*Q) * (2*A*P + B*Q) - 4*A*(A*P*P + B*P*Q + C*Q*Q - 1);

    maxY = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
    minY = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a);

    if(maxY < minY)
    {
        double tempV = maxY;
        maxY = minY;
        minY = tempV;
    }

    //关于X的二元一次方程:Cy² + (Bx-2CQ-BP)y + Ax²-(2AP + BQ)x + (AP²+ BPQ + CQ²−1)= 0
    //令δ=0,b²-4ac 则得到关于y公式:(B²-4AC)x²+[4C(2AP+BQ)-2B(2CQ+BP)]x+(2CQ+BP)²-4C(AP²+ BPQ + CQ²−1) = 0;
    //求解x:
    a = B* B - 4*A*C;
    b = 4*C*(2*A*P + B*Q) - 2*B*(2*C*Q + B*P);
    c = (2 * C * Q + B * P) * (2 * C * Q + B * P) - 4 * C * (A * P * P + B * P * Q + C * Q * Q - 1);
    maxX = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
    minX = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
    if (maxX < minX)
    {
        double tempV = maxX;
        maxX = minX;
        minX = tempV;
    }
    return true;
}

标签:平移,椭圆,double,短轴,圆心,rotation,ref,Math
From: https://www.cnblogs.com/JackieWu/p/18037749

相关文章

  • 椭圆的定义
    椭圆的定义先给出椭圆第一定义:椭圆上的点到两个定点\(F_1,F_2\)的距离之和为定值\(2a\)。用式子表示就是:\(|MF_1|+|MF_2|=2a\)。其中\(F_1,F_2\)为椭圆的焦点,有点类似于圆的圆心。建系:以\(F_1,F_2\)两点形成的直线作为\(x\)轴,以这两点的中垂线作为\(y\)轴。下面......
  • 【C++】OpenCV4-线条、矩形、圆形、椭圆等图形的绘制与填充、RNG随机函数的使用
    图形的绘制与填充://图形的绘制与填充Matcanvas=Mat::zeros(Size(512,512),CV_8UC3);namedWindow("canvas",WINDOW_AUTOSIZE);//相关绘制API演示//绘制直线line(canvas,Point(10,10),Point(400,400),Scalar(255,0,0),1,LINE_8);//绘制矩形Rectrect(150,1......
  • 圆心科技业绩稳健 营收毛利齐升 加速赴港上市
    在我国医疗健康领域,行业深耕超过8年的圆心科技凭借独特的“医-药-险”全链条布局和优秀的生态联动服务能力,成为行业内备受瞩目的代表性企业。据圆心科技于2023年12月18日更新的招股书显示,2023年上半年,圆心科技总营收达到了46.45亿元,同比增长43.1%,毛利持续向好,总收入毛利为8.8%,......
  • 构建更加完善的全病程患者服务网络,圆心科技上市之路愈发顺畅
    中国的智慧医疗模式,是一种创新型的医疗模式,通过建立线上医疗服务平台,将优质医疗资源下沉到基层社区,使得居民可以更加便捷地获得医疗服务。这种模式的出现,为缓解医疗资源紧张问题提供了新的思路和途径。为更好地推进智慧医疗的建设,我国医疗健康企业圆心科技构建了一套贯通诊......
  • 计算两竖直直线与椭圆围成部分面积
    椭圆方程\(\frac{x^2}{a^2}+\frac{y^2}{b^2}=1\),直线\(x=l\),\(x=r\),计算图中蓝色部分的面积。定积分为了找到这个蓝色区域的面积,我们可以使用定积分来积分椭圆上半部分的函数,并在\(x=l\)和\(x=r\)之间计算面积,然后将结果翻倍,因为椭圆是关于x轴对称的。椭圆方程......
  • 进一步探索智慧医疗新模式,圆心科技上市前景广阔
    在政策、监管的多方推动下,我国智慧医疗形势一片大好,数据显示,2022年我国智医疗应用规模约为780.5亿元,到2023年国内智慧医疗应用规模可达到936.6亿元,未来市场份额也将进一步扩已经成为了众多资本眼中的香饽饽。不久前,我国知名医疗健康公司北京圆心科技就完成了多轮融资,为其赴......
  • 椭圆曲线
    椭圆曲线简单总结写这篇文章原因是老是忘记每个符号代表什么,所以搞一个简单的对照表元素符号参考起始点G,可以是任意一点私钥dA一个随机数dA公钥QAQA=dAxG随机数k消息摘要zP点k*G签名(R,S)R是P点的x坐标\(S=k^{-1}(z+dA......
  • 企业总营收实现连年递增,圆心科技上市再添砝码
    中国智慧医疗赛道经过十多年的发展演变逐渐发展成熟。随着医药分开、药械集采、“双通道”等医改政策的深入推进,相关企业再次迎来了新一波发展机遇,更加受到资本市场的关注。根据公开信息显示,我国医疗健康企业北京圆心科技集团股份有限公司于5月29日,向港交所递交了更新后的招股......
  • 医疗健康产业进入强势发展期,圆心科技上市加大
    统计数据显示,截至2021年底,全国60岁及以上老年人口达2.67亿,65岁及以上老年人口达2亿以上,老龄化程度加剧。据测算,2035年左右,60岁及以上老年人口将突破4亿,在总人口中的占比将超过30%,进入重度老龄化阶段。老龄化在衍生出许多社会问题的同时,也刺激了医疗大健康行业的发展,并且国家政......
  • 椭圆曲线加密笔记
    数学知识域:一组元素的集合,以及在集合上的四则运算,构成一个域。其中加法和乘法必须满足交换、结合和分配的规律。加法和乘法具有封闭性,即加法和乘法结果仍然是域中的元素。域中必须有加法单位元和乘法单位元,且每一个元素都有对应的加法逆元和乘法逆元。但不要求域中的0有乘法逆......