主要な浮動小数点演算を行うプログラムの半分を作成しました。開始したデータによっては、線分を表す非常に大きな配列を生成できます。これらのライン セグメントの位置は、ラインの各端点の X、Y、Z 位置を記録するために、浮動小数点数を含むデカルト座標系を使用して記録されます。両端に X,Y,Z を使用することはできないので、最初に X,Y,Z を使用し、最後に Q,R,S を使用しました。したがって、基本的に私がやりたいことは、同一または反転したすべての行にフラグを立てて、1行目のQ、R、Sが2行目のX、Y、Zと等しくなり、1行目のX、Y、Zが等しくなるようにすることです2行目のQ、R、S。私の現在のフラグ テクニックは、X を -1 に設定することです。両方の行にフラグを立てたくありません。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 倍高速化する適切な方法がない場合は、めちゃくちゃなデータに対処し、次の関数を十分にスマートにして無視する必要があるかもしれません。ただし、次の関数は、データの重複を補正しようとせずに十分に複雑であるため、不良行にフラグを立てることは非常に役立ちます。