我做了半个程序来做一些主要的浮点数学运算。根据它开始的数据,它可以生成描述线段的非常大的数组。这些线段的位置是用笛卡尔坐标系记录的,用浮点数记录线段各端的X、Y、Z位置。我不能在两端使用 X,Y,Z,所以我使用 X,Y,Z 作为开始,使用 Q,R,S 作为结束。所以基本上我想做的是标记所有相同或翻转的行,以便第一行的 Q、R、S 等于第二行的 X、Y、Z 和第一行的 X、Y、Z 等于Q,R,S 在第二行。我目前的标记技术是将 X 设置为 -1,因为我知道没有一条线会以负坐标结束。我不想标记两条线,只标记除一条之外的所有线。这是我目前的功能:
int filter(int lines)
{
printf("Filtering...\n");
refline=0;
scanline=1;
while(refline<(lines))
{
if( segpointX[refline] == segpointQ[scanline] && segpointY[refline] == segpointR[scanline] && segpointZ[refline] == segpointS[scanline] && segpointQ[refline] == segpointX[scanline] && segpointR[refline] == segpointY[scanline] && segpointS[refline] == segpointZ[scanline]
|| segpointX[refline] == segpointX[scanline] && segpointY[refline] == segpointY[scanline] && segpointZ[refline] == segpointZ[scanline] && segpointQ[refline] == segpointQ[scanline] && segpointR[refline] == segpointR[scanline] && segpointS[refline] == segpointS[scanline])
{
//printf("Origional: %f %f %f >< %f %f %f\n",segpointX[refline],segpointY[refline],segpointZ[refline],segpointQ[refline],segpointR[refline],segpointS[refline]);
//printf("Duplicate: %f %f %f >< %f %f %f\n\n",segpointX[scanline],segpointY[scanline],segpointZ[scanline],segpointQ[scanline],segpointR[scanline],segpointS[scanline]);
segpointX[scanline]=-1;
}
scanline++;
if(scanline==lines+1)
{
refline++;
scanline=refline+1;
}
}
return(0);
}
我知道我有多少行,这就是“行”整数。这段代码完全按照它应该的方式工作,但与我的程序的其余部分相比它真的很慢。我认为必须有一种方法可以更快地做到这一点,但我不确定如何。拥有这个功能真的很可惜,因为它拖累了我的程序的其余部分,考虑到它的所有浮点数学,它的速度非常快。如果没有像样的方法让这个速度比现在快 3 倍,我可能只需要忍受混乱的数据并让下一个函数足够聪明以忽略它。然而,现在标记坏行将非常有用,因为下一个函数足够复杂,因为它没有试图补偿我的数据中的重复项。