RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1293488
Accepted
Fire13nyu
Fire13nyu
Asked:2022-06-09 20:35:41 +0000 UTC2022-06-09 20:35:41 +0000 UTC 2022-06-09 20:35:41 +0000 UTC

解析几何:查找椭球和圆锥切点

  • 772

给定一个点P(xp,yp,zp)和一个椭球,其半轴和中心是已知的,它的方程:x^2/a^2+y^2/a^2+z^2/b^2=1。

点 P 位于椭球外一定距离处。从 绘制的椭圆体的切线集P形成一个圆锥曲面。有必要找到这个圆锥和椭球的接触点的一般形式(很明显,这些点将属于椭圆,也就是说,问题本质上归结为找到它们之间的接触椭圆方程圆锥体和椭球体)。

是否可以通过传递到球坐标来简化这里的问题?如果是,如何进行?如果不是,那么问题是一样的。

математика
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Pak Uula
    2022-06-10T15:31:21Z2022-06-10T15:31:21Z

    来自该点的射线锥P = (x,y,z)与椭球相接触的点的显式表达式:

    在此处输入图像描述

    这些点以参数形式给出。如果您设置omega = 2pi, 并t从 0 运行到 1,则此表达式将遍历所有必需的点。

    为了推导出这个表达式,我使用了一个符号数学系统sympy。逐步输出作为 Jupyter notebook 发布。

    这个想法很简单。我们需要切换到一个坐标系,在这个坐标系中,椭圆被转换成一个单位球体,并且点P在轴上Z 。在这种情况下,球体与圆锥体接触点的方程很容易自然地推导出来。剩下的只是将坐标转换回来。为此,我利用了sympy没有用无穷无尽的字母链四处寻找的优势。

    更新

    我在Jupyter notebook中添加了一种数值方法来计算切线椭圆。

    这个想法是C在坐标系中找到三个向量 - 切圆的中心和两个正交向量,其旋转描述了所需的圆。

    坐标系中的这些向量A形成一个正切椭圆。

    在 Python 中计算三个向量的函数(不是 Matlab 中的剪影)。

    def tangent_cone(a,b, P):
        """
        Возвращает три вектора `c,v1,v2`, определяющие эллипс, по точкам которого эллипсоид касается конус с вершиной `P`.
        
        Точки r_tan эллипса вычисляются так:
        ```
        c, v1, v2 = tangent_cone(a,b, P)
        t = np.linspace(0, 2*np.pi, 100)
        r_tan = c.reshape(3,1) + v1.reshape(3,1)*np.cos(t) + v2.reshape(3,1)*np.sin(t)
        ```
        В этом случае r_tan - матрица из 3 строк и 100 столбцов. Первая строка - координата `x` точек, 
        вторая строка - координата `y`, третья строка - координата `z`.
        """
        assert P.ndim == 1
        assert len(P) == 3
        
        x,y,z = P
        R = np.sqrt(x**2/a**2 + y**2/a**2 + z**2/b**2)
        cos_theta = (z/b)/R
        # theta меняется от 0 до pi, поэтому sin(theta) >= 0
        sin_theta = np.sqrt(1 - cos_theta**2)
        
        sin_phi = (y/a)/(sin_theta*R)
        cos_phi = (x/a)/(sin_theta*R)
        
        center = np.array([a*cos_phi*sin_theta/R, a*sin_phi*sin_theta/R, b*cos_theta/R])
        
        r = np.sqrt(1 - 1/R**2)
        v1 = np.array([a*r*cos_phi*cos_theta, a*r*sin_phi*cos_theta, -b*r*sin_theta])
        v2 = np.array([-a*r*sin_phi, a*r*cos_phi, 0])
        
        return center, v1, v2
    

    要计算椭圆的点,您需要围绕点旋转矢量center:

    c, v1, v2 = tangent_cone(a,b, P)
    t = np.linspace(0, 2*np.pi, 100)
    r_tan = c.reshape(3,1)+v1.reshape(3,1)*np.cos(t) + v2.reshape(3,1)*np.sin(t)
    

    该矩阵r_tan具有三行 100 个坐标。这些线对应于坐标x和。yz

    从具有坐标的点切线到具有半轴 1 和 4 的椭球的示例(5,5,5)

    在此处输入图像描述

    • 6
  2. MBo
    2022-06-10T17:50:32Z2022-06-10T17:50:32Z

    由于椭球是一个以原点为中心的平板,具有短 OZ 轴,即 很简单,你可以试试直接的方法。

    如果从椭球(px, py, pz)上的一点到一点画切线(tx, ty, tz),那么椭球在该点的法线垂直于切线,点积为零。根据 Kornov 的参考书,此时椭球表面的法线看起来像(tx/a^2, ty/a^2, tz/b^2)这样(这里我的系数可能会出错)

    (px-tx)*tx/a^2 + (py-ty)*ty/a^2 + (pz-tz)*tz/b^2 = 0
    px*tx/a^2 + py*ty/a^2 + pz*tz/b^2 = tx^2/a^2 + ty^2/a^2 + tz^2/b^2
    

    但是右边等于一(根据原方程),所以我们得到了切割椭球的平面的方程

    px*x/a^2 + py*y/a^2 + pz*z/b^2 - 1 = 0
    

    为了找到截面的中心,我们用z表示,将它代入原方程,我们得到一个OXY中的椭圆,它是截面椭圆的投影。对他来说,中心不难找到,那我们就回到三维空间。

    仍然要找到椭圆的轴(未完成)

    • 0
  3. Fire13nyu
    2022-06-10T20:58:19Z2022-06-10T20:58:19Z
    function [] = myfunc(a,b,xc,yc,zc)
    x=-20:0.1:20;
    y=x; z=x;
    % A - initial coordinate system; B - coordinate system, where ellipsoid is the unit sphere;
    % C - coordinate system, where ellipsoid is the unit sphere and Oc is on axis Z
    A2B = [1/a,0,0;0,1/a,0;0,0,1/b]; 
    B2A = [a,0,0;0,a,0;0,0,b];
    
    % translate the coordinates of the camera into a coordinate system B
    OC = A2B*[xc,yc,zc]';
    XC = OC(1); YC = OC(2); ZC = OC(3);
    
    R=sqrt(x.^2/a^2+y.^2/a^2+z.^2/b^2);
    theta = acos(ZC./R);
    phi = acos(XC./(R.*sin(theta)));
    B2C = cell(length(R));
    C2B = cell(length(R));
    OP = cell(length(R));
    omega = 2*pi;
    t = 0:0.01:1;
    for k=1:length(R)
        B2C{k} = [cos(phi(k)).*cos(theta(k)),sin(phi(k)).*cos(theta(k)),-sin(theta(k));...
               -sin(theta(k)),            cos(phi(k)),                0            ;...
               sin(theta(k)).*cos(phi(k)),sin(phi(k)).*sin(theta(k)), cos(theta(k))];
           
        C2B{k} = [cos(phi(k)).*cos(theta(k)),-sin(phi(k)),sin(theta(k)).*cos(phi(k));...
               sin(phi(k)).*cos(theta(k)), cos(phi(k)),sin(phi(k)).*sin(theta(k));... 
               -sin(theta(k)),             0,          cos(theta(k))            ];
           
           
        r = sqrt(1-1/(R(k)^2));
        h = 1/R(k);
        OP{k} = B2A*C2B{k}*[r*cos(omega*t),r*sin(omega*t),h]';
    end
    
    end
    
    • 0

相关问题

  • 如何改变偏置神经元的权重。反向传播

  • 预测没有趋势且具有明显每日季节性的时间序列

  • 矩阵和三次方程

  • 伯努利(泊松)公式

  • 什么是百分位数,如何使用它以及如何计算它?

  • 关于概率论的问题(来自茶壶)

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5