我目前正在尝试创建一个最小的“3D”引擎来渲染体素和平面,但我遇到了一些问题。现在,我正在尝试制定一种算法,根据物体在相机中的位置对物体进行排序。后面的东西总是先被绘制,如果它们的 Z 轴(直接在相机前面的距离)相同,它会绘制离屏幕中心更远的那个。
我有一个我知道可以在我的电脑上运行的版本,同时使用
gcc
和 clang
,但是一旦我使用我正在开发的设备的工具链编译它,它就会开始出现故障并且不会做我想做的事。输出每隔一段时间就会改变一次。我可以告诉我如何修复它或实现与我正在使用的工具链分开的 qsort
功能吗?
// includes
int8_t player_x = 0;
int8_t player_y = 0;
int8_t player_z = 0;
int compareCoordinates(const void *a, const void *b) {
int8_t *coord1 = (int8_t *)a;
int8_t *coord2 = (int8_t *)b;
if ((coord2[2] - coord1[2]) != 0) {
return (coord2[2] - coord1[2]);
}
int value = (abs(coord2[0] - player_x) + abs(coord2[1] - player_y)) - (abs(coord1[0] - player_y) + abs(coord1[1] - player_y));
if (value == 0){
return 1;
}
return value;
}
void sortCoordinateList(int8_t coordinates[][3], int numCoordinates) {
qsort(coordinates, numCoordinates, sizeof(coordinates[0]), compareCoordinates);
}
int8_t coordinates[][3] = {
{1, 2, 5},
{-1, 2, 5},
{-3, 2, 5},
};
int main(void)
{
sortCoordinateList(coordinates, LEN(coordinates));
for (int i = 0; i < LEN(coordinates); i++) {
dbg_printf("(%d, %d, %d)\n", coordinates[i][0], coordinates[i][1], coordinates[i][2]);
}
dbg_printf("\n\n");
}
这是代码片段,删除了移动功能,但这是主要内容。我对 C 编程相当陌生,但我知道
qsort
随机处理具有相同值的项目或类似的东西,称为 stable sorting
,但我非常有信心事实并非如此。
我尝试了多种不同的调试和测试方法,但我完全被难住了。通常当我遇到错误时,我会自己解决,但我不得不屈服并提出我的第一个 StackOverflow 问题。顺便说一句,从今天到昨天,我已经为此工作了至少 13-15 个小时,所以是的,我已经尽了一切努力。
这是一个类型问题,你没有得到你认为作为比较函数的参数得到的东西。
qsort
将使用指针运算符将指针传递给数组的元素。如果您有一个由三个 int8_t
元素组成的数组的数组,则比较函数将获得一个指向由三个 int8_t
元素组成的数组的指针。
正确的类型是
int8_t (*)[3]
,而不是 int8_t *
:
int compareCoordinates(const void *a, const void *b) {
int8_t (*coord1)[3] = (int8_t (*)[3])a;
int8_t (*coord2)[3] = (int8_t (*)[3])b;
// ...