标题:读取文本内的XYZ坐标,并找出重复的点(两点距离小于0.00001算重复)
只看楼主
KS010005
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2021-3-28
结帖率:50%
已结贴  问题点数:20 回复次数:3 
读取文本内的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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
你不肯说出数据规模,那用数组呢,malloc呢,还是硬盘交换呢?

程序代码:
#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
KS010005
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2021-3-28
得分:0 
回复 2楼 rjsp
多谢大神指点,我现在我写的给您看一下,写不下去了
struct point
{
    public:
        double x;
        double y;
        double z;
        get(double a,double b,double c);
 };
 point::get(double a,double b,double c)
 {
     x=a;
     y=b;
     z=c;
 }
int main()
{
 int i=1;
 FILE *fi;
 fi=fopen("D:/C++ learning/XYZ.txt","r");
 for(i=1;i<4;i++)
 {
 char str[100];
 fgets(str,100,fi);
 printf("%s",str);
2021-03-29 16:56
KS010005
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2021-3-28
得分:0 
回复 2楼 rjsp
下面是老师发的,看不懂呢!1

請檔請用  fgets. => char sLine[100]
  point::get( char* sLine)
  再依設定讀出數值.
 1. 是前為不帶小數點
  2. 不帶小數點
     2.1 前導零或後導零
     2.2 導零位數
2021-03-29 17:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505281-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.078840 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved