我正在編寫函數來測試矩形與超橢圓的交集。 矩形將始終是軸對齊的,而超橢圓可以以旋轉角度α定向。算法檢測軸對齊的矩形和定向的超橢圓之間的交集
在軸對齊的矩形與軸對齊的超橢圓相交的情況下,我寫了這兩個功能非常好的短函數。代碼簡潔,清晰,高效。如果可能的話,我想爲新的更一般的功能保持類似的結構。
這裏是我有,如果軸對齊的矩形相交軸對齊超橢圓檢測:
double fclamp(double x, double min, double max)
{
if (x <= min) return min;
if (x >= max) return max;
return x;
}
bool rect_intersects_superellipse(const t_rect *rect, double cx, double cy, double rx, double ry, double exponent)
{
t_pt closest;
closest.x = fclamp(cx, rect->x, rect->x + rect->width);
closest.y = fclamp(cy, rect->y, rect->y + rect->height);
return point_inside_superellipse(&closest, cx, cy, rx, ry, exponent);
}
bool point_inside_superellipse(const t_pt *pt, double cx, double cy, double rx, double ry, double exponent)
{
double dx = fabs(pt->x - cx);
double dy = fabs(pt->y - cy);
double dxp = pow(dx, exponent);
double dyp = pow(dy, exponent);
double rxp = pow(rx, exponent);
double ryp = pow(ry, exponent);
return (dxp * ryp + dyp * rxp) <= (rxp * ryp);
}
這工作正常,但 - 正如我所說的 - 只爲一個軸對齊超橢圓。
現在我想將它概括爲一個定向的超橢圓,使算法結構儘可能地接近上面。然後 的前兩個函數最明顯的擴大將成爲類似:
bool rect_intersects_oriented_superellipse(const t_rect *rect, double cx, double cy, double rx, double ry, double exponent, double radians)
{
t_pt closest;
closest.x = fclamp(cx, rect->x, rect->x + rect->width);
closest.y = fclamp(cy, rect->y, rect->y + rect->height);
return point_inside_oriented_superellipse(&closest, cx, cy, rx, ry, exponent, radians);
}
bool point_inside_oriented_superellipse(const t_pt *pt, double cx, double cy, double rx, double ry, double exponent, double radians)
{
double dx = pt->x - cx;
double dy = pt->y - cy;
if (radians) {
double c = cos(radians);
double s = sin(radians);
double new_x = dx * c - dy * s;
double new_y = dx * s + dy * c;
dx = new_x;
dy = new_y;
}
double dxp = pow(fabs(dx), exponent);
double dyp = pow(fabs(dy), exponent);
double rxp = pow(rx, exponent);
double ryp = pow(ry, exponent);
return (dxp * ryp + dyp * rxp) < (rxp * ryp);
}
用於面向超橢圓,上面並沒有正確地獨立工作達到預期效果,即使point_inside_oriented_superellipse()
。我無法使用上述函數來測試與軸對齊的矩形的交點。我一直在線研究大約一週,我發現一些解決方案需要逆矩陣變換來均衡超橢圓軸並將其原點設置爲(0,0)。折衷是,現在我的矩形不再是矩形,並且當然不是軸對齊的。我想避免走這條路。 我的問題是展示如何使上述算法保持其結構或多或少不變。如果不可能保持相同的算法結構,請顯示最簡單,最有效的算法來測試軸對齊矩形和定向超橢圓之間的交集。我只需要知道交叉點是否發生(布爾結果)。 指數參數的範圍可以從0.25到100.0不等。
感謝您的任何幫助。
你確定你的方法有效嗎?你只是測試矩形頂點,是嗎?但即使對於一個圓,您也可以使圓和矩形相交,而圓中沒有任何頂點。 – dmuir
對於一個軸對齊的超橢圓 - 是的 - 我確定我的方法正常工作。我對它進行了徹底的測試,並始終使用它。不,我不只是測試矩形頂點。代碼在那裏,請自己嘗試一下,看看... –