空間中球與立方體的相交判定

2021-10-08 16:31:06 字數 2297 閱讀 7420

首先我們做出規定:球心座標為center[3],半徑為r,立方體左下角座標為cube[3],邊長為a,這些條件已經足夠約束了,只是為了方便起見,再計算幾個值:dis[3]表示球心到立方體中心的三軸距離的絕對值。

首先我們來分割一下立方體的區域,首先看下邊的立方體,將立方體的每乙個面做出延伸,可以發現空間被分割成了27個空間,其中在立方體外的有26個空間,其中有6個空間是與立方體的面接觸,12個空間是和立方體的邊接觸,8個空間與立方體的頂點接觸,下邊就分別從這三個方面來考慮球與立方體的相交情況。

首先可以篩去很多區域,可以想到球心位於中心在立方體中心,邊長為(a+2r)的立方體之外時,球不可能與立方體相交,於是有:

double maxdis = r + a / 2;

//第一種情況剔除

if (dis[0] >= maxdis || dis[1] >= maxdis || dis[2] >= maxdis)

return false;

面接觸的情況如下,首先球心的座標對立方體面的投影應該在正方形之內,然後確保圓心到立方體中心的距離小於a/2+r

於是有:

//第二種情況,只要兩個維度到立方體中心距離小於a/2,則球與立方體面相交

int cnt = 0;

for (int i = 0; i < 3;i++)if (dis[i] < a / 2)cnt++;

if (cnt >= 2)return true;

如果球與頂點接觸,那麼離球最近的零點位於球內,有:

//第三種情況

這個和3.1很接近,因為實際上這個是3.1的簡化版,乙個方向上的距離為0,所以只需要計算兩個即可,和上邊**類似,所以我們將3.1和3.2寫在一起:

//第三種情況

double xd = max(dis[0] - a / 2, 0);

double yd = max(dis[1] - a / 2, 0);

double zd = max(dis[2] - a / 2, 0);

return xd * xd + yd * yd + zd * zd < r * r;

當求與立方體頂點相交時,dis[i]-a/2都是正的,所以和3.1**一致,如果邊相交,其中有乙個值是負的,加了max可以變成0,與3.2部分吻合,所以最後的**為:

bool check(double center, double cube, double r, double a) ;

double dis[3] = ;

double maxdis = r + a / 2;

//第一種情況剔除

if (dis[0] >= maxdis || dis[1] >= maxdis || dis[2] >= maxdis)

return false;

//第二種情況,只要兩個維度到立方體中心距離小於a/2,則球與立方體面相交

int cnt = 0;

for (int i = 0; i < 3;i++)if (dis[i] < a / 2)cnt++;

if (cnt >= 2)return true;

//第三種情況

double xd = max(dis[0] - a / 2, 0);

double yd = max(dis[1] - a / 2, 0);

double zd = max(dis[2] - a / 2, 0);

return xd * xd + yd * yd + zd * zd < r * r;

}

OPENGL ES20 立方體 球型繪製

繪製流程跟2維圖形繪製一致,只是座標需要自己去計算。圓柱體 圓錐 球型,其實就是繪製乙個乙個的圓形,將他們無限分割就是乙個乙個的圓 立方體 public class cube extends shape private final string fragmentshadercode precisio...

ACM 奇特的立方體

題目描述 奇特的立方體 任意給出8個整數,將這8個整數分別放在乙個立方體的八個頂點上,要求檢驗每個面上的四個數之和相等這個條件能否被滿足。輸入一次輸入8個整數輸出yes或者no yes表示可能構成滿足條件的立方體 no則表示不能 樣例輸入1 2 3 4 5 6 7 8樣例輸出yes 思路 標記8個頂...

OpenGL旋轉立方體的實現

計算機圖形學大作業 使用opengl實現旋轉的正方體。主要分為搭建環境和完成 編寫兩部分。安裝完成後,我們可以建立opengl的demo過程如下 檔案 新建 專案 opengl 直接編譯執行demo,將會展示乙個旋轉的三角形如下圖所示 另外如需使用其他opengl庫,需要自行配置 將相關.dll檔案...