读取文本内的XYZ坐标,并找出重复的点(两点距离小于0.00001算重复)
123.456,234.567,-345.678-12.45,23.56,-34.67
2.45,-3.56,4.67
123.456,234.567,-345.678
12.45,-23.56,-34.67
2.45,-3.56,-4.67
以上为txt内的数据,每一行代表xyz,用逗号隔开,实在想不出来了,大家帮忙想一想,我使用结构体,然后fscanf取数据
2021-03-28 22:34
程序代码:#include <stdio.h>
#include <math.h>
#include <assert.h>
int main( void )
{
FILE* fin = fopen( "a.txt", "rt" );
if( !fin )
{
puts( "文件打开失败" );
return 1;
}
struct foo {
double x, y, z;
};
struct foo buf[100]; // 你可以在这里调整缓冲区大小
const size_t buf_capacity = sizeof(buf)/sizeof(*buf);
size_t buf_size = 0;
for( ; buf_size!=buf_capacity && fscanf(fin,"%lf ,%lf ,%lf",&buf[buf_size].x,&buf[buf_size].y,&buf[buf_size].z)==3; ++buf_size );
if( !feof(fin) )
{
fclose( fin );
puts( "文件格式错误,未读取完毕" );
return 2;
}
fclose( fin );
const double tolerance = 0.00001; // 你可以在这里设置 距离的平方值
assert( tolerance > 0 );
for( size_t i=0; i!=buf_size; ++i )
{
for( size_t j=i+1; j!=buf_size; ++j )
{
double dx = fabs(buf[i].x-buf[j].x);
double dy = fabs(buf[i].y-buf[j].y);
double dz = fabs(buf[i].z-buf[j].z);
if( dx<tolerance && dx<tolerance && dx<tolerance && dx*dx+dy*dy+dz*dz<tolerance*tolerance )
printf( "(%g,%g,%g)与(%g,%g,%g)距离近于指定值\n", buf[i].x,buf[i].y,buf[i].z, buf[j].x,buf[j].y,buf[j].z );
}
}
return 0;
}
2021-03-29 09:14
2021-03-29 16:56
2021-03-29 17:06