Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 球面上两直线段间相对角的近似计算_Matlab_Math_Geometry_Computational Geometry - Fatal编程技术网

Matlab 球面上两直线段间相对角的近似计算

Matlab 球面上两直线段间相对角的近似计算,matlab,math,geometry,computational-geometry,Matlab,Math,Geometry,Computational Geometry,我需要一个主意!我想在3D中对眼睛上的血管网络进行建模。我已经对与血管直径、长度等相关的分支行为进行了统计。我现在所关注的是可视化: 眼睛近似为一个球体,中心位于origoC=[0,0,0]和半径r 我想要实现的是基于以下输入参数,它应该能够在E的表面/周长上绘制线段: 输入: 上一段结束的笛卡尔位置:P_0=[x_0,y_0,z_0] 段长度:L 节段直径:d 相对于上一段的所需角度:a(1) 输出: 结果段结束的笛卡尔位置:P_1=[x_1,y_1,z_1] 我现在要做的是: 从P_

我需要一个主意!我想在3D中对眼睛上的血管网络进行建模。我已经对与血管直径、长度等相关的分支行为进行了统计。我现在所关注的是可视化:

眼睛近似为一个球体,中心位于origo
C=[0,0,0]
和半径
r

我想要实现的是基于以下输入参数,它应该能够在
E
的表面/周长上绘制线段:

输入:

  • 上一段结束的笛卡尔位置:
    P_0=[x_0,y_0,z_0]
  • 段长度:
    L
  • 节段直径:
    d
  • 相对于上一段的所需角度:
    a
    (1)
输出:

  • 结果段结束的笛卡尔位置:
    P_1=[x_1,y_1,z_1]
我现在要做的是

  • P_0
    ,生成一个半径为
    L
    的球体,表示我们可能绘制到的具有正确长度的所有点。此集合称为
  • 限制
    pool
    仅包括距离
    C
    r*0.95
    r
    之间的点,因此仅包括眼睛周围的点
  • 仅选择将生成最接近所需角度
    a
    的相对角度(2)的点
  • 问题在于,无论我想要什么角度
    a
    ,实际上都不是点积所测量的角度。假设我想要一个0的角度(也就是说,由于球体的曲率,新线段的方向与前一线段的方向相同,实际上我得到的是一个30度左右的角度。我想我想要的更多的是从球体到分支点的正交角度看时的2D角度。请看下面的屏幕截图以获得可视化效果

    有什么想法吗


    (1) 这样做的原因是,直径最大的子节点通常遵循前一段的路径,而较小的子节点的角度往往不同

    (2) 由
    acos(点(v1/norm(v1),v2/norm(v2))计算得出)


    解释问题的屏幕截图:

    黄线:上一段 红线:其中一个点的“新”段(不一定是正确的) 蓝色x'es:池(文本=角度,弧度)


    我将用我自己的符号重申这个问题:

    给定以C为中心半径为r的球体表面上的两点p和Q,找到一个新点T,使从PQ到QT的转角为a,QT的长度为L

    由于线段相对于球体较小,我们将在轴点Q处使用球体的局部平面近似(如果这不是一个好的假设,您需要在问题中更加明确)

    然后可以按如下方式计算T

    // First compute an aligned orthonormal basis {U,V,W}.
    //  - {U,V} should be a basis for the plane tangent at Q.
    //  - W should be normal to the plane tangent at Q.
    //  - U should be in the direction PQ in the plane tangent at Q
    W = normalize(Q - C)
    U = normalize(Q - P)
    U = normalize(U - W * dotprod(W, U))
    V = normalize(crossprod(W, U))
    
    // Next compute the next point S in the plane tangent at Q.
    // In a regular plane, the parametric equation of a unit circle
    // centered at the origin is:
    //     f(A) = (cos A, sin A) = (1,0) cos A + (0,1) sin A
    // We just do the same thing, but with the {U,V} basis instead
    // of the standard basis {(1,0),(0,1)}.
    S = Q + L * (U cos A + V sin A)
    
    // Finally project S onto the sphere, obtaining the segment QT.
    T = C + r * normalize(S - C)
    

    我不确定我是否得到了您想要做的:球体-圆柱体相交?(圆柱体轴穿过原点?)。即,您想在球体上画圆?您所说的线段并不清楚。它是球体上的圆形线段吗?此线段的直径是指在球体上测量还是穿过球体?在这两种情况下,在点
    P_0
    处创建球体都是不够的。如果通过球体测量的圆段的平均半径,你需要一个圆柱体,如果你的意思是在球体上测量,你需要一些不同的东西基本上是线段。从一个分支点到另一个分支点。此外,直径仅用于可视化,与绘制方向的讨论无关。如果线段是(直线)直线,为什么它有长度和直径?不用管直径。在我的最后一个程序中,线段是矩形而不是直线。更新:Cylinder谢谢你,先生。这确实像我要找的。我今天晚些时候有机会的时候会试着实现它。这还不够。进一步的要求是T也应该被定位球体上的d。这对角度有一个约束,但我们正在寻找的角度实际上是正交观察分支点时的角度。这有什么意义吗?@c.jespersen抱歉,我无意中遗漏了一步。请参见编辑。S是切面上Q T处的下一个点。然后S投影到球体上。wWorks.太棒了。我能请你对每个向量、它的角色等说几句话吗?@c.jespersen我添加了一些解释,还添加了一个额外的步骤(可能不必要)来将U投影到Q处的相切平面上。