读取文本内的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取数据
#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; }