我正在尝试制作一种方法来计算C中的光线盒交叉点。我用Google搜索的大部分程序都显示了返回bool的方法(如果有或没有交叉点)。但是,我需要一个可以返回元组的方法(我知道C中没有元组,但是我创建了一个结构来表示它)。具体来说,我需要tmin和tmax的值,即使它们是负数,并且如果该值不存在则指定它们为负值。我应该如何管理这个正常工作的回报?我在C中生成的代码基于此页面中显示的代码:https://tavianator.com/fast-branchless-raybounding-box-intersections-part-2-nans/。我程序中代码的实际实现如下:
RectMinMax* Intersection(BoundingBox* b, Ray* r) {
RectMinMax* TMinMax = malloc(sizeof(RectMinMax));
float tmin = -INFINITY, tmax = INFINITY;
if (ray_get_direction(r).X != 0) {
float t1 = (b->x - ray_get_origin(r).X) / ray_get_direction(r).X;
float t2 = ((b->x + b->length) - ray_get_origin(r).X)/ ray_get_direction(r).X;
tmin = fmaxf(tmin, fminf(t1, t2));
tmax = fminf(tmax, fmaxf(t1, t2));
}
else if (ray_get_origin(r).X <= b->x || ray_get_origin(r).X >= (b->x + b->length)) {
TMinMax->min = -55;
TMinMax->max = -55;
return TMinMax;
}
if (ray_get_direction(r).Y != 0) {
float t1 = (b->y - ray_get_origin(r).Y) / ray_get_direction(r).Y;
float t2 = ((b->y + b->width) - ray_get_origin(r).Y)/ ray_get_direction(r).Y;
tmin = fmaxf(tmin, fminf(t1, t2));
tmax = fminf(tmax, fmaxf(t1, t2));
}
else if (ray_get_origin(r).Y <= b->y || ray_get_origin(r).Y >= (b->y + b->width)) {
TMinMax->min = -55;
TMinMax->max = -55;
return TMinMax;
}
if (ray_get_direction(r).Z != 0) {
float t1 = (b->z - ray_get_origin(r).Z) / ray_get_direction(r).Z;
float t2 = ((b->z + b->height) - ray_get_origin(r).Z)/ ray_get_direction(r).Z;
tmin = fmaxf(tmin, fminf(t1, t2));
tmax = fminf(tmax, fmaxf(t1, t2));
}
else if (ray_get_origin(r).Z <= b->z || ray_get_origin(r).Z >= (b->z + b->height)) {
TMinMax->min = -55;
TMinMax->max = -55;
return TMinMax;
}
if (tmax > tmin && tmax > 0) {
TMinMax->min = tmin;
TMinMax->max = tmax;
return TMinMax;
}
else {
TMinMax->min = -55;
TMinMax->max = -55;
return TMinMax;
}
}
RectMinMax只是一个带有属性max和min的结构。在代码中我使用-55来表示&#34;返回false&#34;链接中的代码的情况。据我所知,我遗漏了tmax为正且tmin为负的情况,但我不知道如何修复它。