<ol>
<li><p><strong>想象2条无限线</strong></p>
<ul>
<li>圆锥轴</li>
<li>穿过垂直于圆锥轴的点<code>P</code>(起始点为立方体中心)的直线。在</li>
</ul>
<p>圆锥轴是已知的,所以很容易,第二条直线定义为</p>
<pre><code>P+t*(perpendicular vector to cone axis)
</code></pre>
<p>这个向量可以通过锥轴向量和垂直于图像的向量(假设Z轴)的乘积来获得。<code>t</code>是标量值参数。。。</p></li>
<li><p><strong>计算这两条线/轴的交集</strong></p>
<p>如果你不知道这些方程,就推导它们或者搜索它们。设交点为<code>Q</code></p></li>
<li><p><strong>如果交点<code>Q</code>不在圆锥内</strong></p>
<p>(在顶点和底之间)则点<code>P</code>不是与圆锥体相交。从交集方程中,您将获得参数<code>t1</code>和<code>t2</code></p>
<ul>
<li>设<code>t1</code>为<code>P</code>轴线</li>
<li>圆锥轴线为<code>t2</code></li>
</ul>
<p>如果轴线方向向量也是圆锥体的长度,则交点在圆锥体内如果<code>t2 = <0,1></code></p></li>
<li><p><strong>如果<code>P</code>不在三角形内(由这两个轴生成的切锥到平面)</strong></p>
<p>这也很容易知道<code>Q</code>在圆锥(<code>t2</code>)内的位置,所以你知道圆锥在<code>P</code>-轴上,从<code>Q</code>到{<cd17>}的距离,其中<code>R</code>是圆锥体的底半径。所以你可以计算<code>|P-Q|</code>并检查它是否是<code><=R*t2</code>,或者直接使用<code>t1</code>(如果<code>P</code>轴方向向量是单位)。在</p>
<p>如果距离较大,则<code>R*t2</code>点<code>P</code>不与圆锥体相交。</p></li>
<li><p><strong>如果#3和#4为正,则<code>P</code>与圆锥体相交</strong></p>
<p><img src="https://i.stack.imgur.com/g0i3N.png" alt="cone"/></p>
<ul>
<li>希望你不介意这里是你的形象,为清晰起见添加了一些东西</li>
</ul></li>
</ol>
<p><strong>[注意事项]</strong></p>
<p>现在最困难的是,当立方体的顶点不与圆锥体相交,而立方体本身却与圆锥体相交时,存在边的情况。当<code>||P-Q|-R*t2| = <0,half cube size></code>在这种情况下,你应该检查更多的点,而不是沿着最近的立方体面立方体顶点。在</p>
<p><strong>另一种方法是:</strong></p>
<ol>
<li><p><strong>为圆锥体创建变换矩阵</strong></p>
<p>其中:</p>
<ul>
<li>它的顶点作为原点</li>
<li>其轴为<code>+Z</code>轴</li>
<li>并且<code>XY</code>平面与其基底平行</li>
</ul>
<p>所以任何一个点都在圆锥内,如果</p>
<ul>
<li><code>Z = <0,h></code></li>
<li><code>X*X + Y*Y <= (R*Z/h)^2</code>或{<cd31>}</li>
</ul></li>
<li><p>将空间转换为</strong cone></p>
<p>检查是否有顶点在圆锥体内,你也可以用#1(代数)的条件检查所有立方体的边线,或者像前面的方法那样沿着立方体面使用更多的点。</p></li>
</ol>
<p>聊天讨论:<a href="http://chat.stackoverflow.com/rooms/48756/discussion-between-spektre-and-joojaa">http://chat.stackoverflow.com/rooms/48756/discussion-between-spektre-and-joojaa</a></p>