C#面积加权,最短距离

该代码段涉及数据库查询,使用OleDbDataAdapter从test和A、B表中提取数据。对数据进行计算,包括平均值和距离计算,并将结果存储到新的DataTable中。之后,将结果写入文本文件。主要处理逻辑集中在循环结构中,用于遍历和计算关联数据。
摘要由CSDN通过智能技术生成

string sql9 = "select * from test";                                              //dt 存储Triange表中的原始数据
            OleDbDataAdapter dbDataAdapter9 = new OleDbDataAdapter(sql9, oleDb);
            DataTable dt9 = new DataTable();
            dbDataAdapter9.Fill(dt9);
            DataTable dt0 = new DataTable();
            dt0.Columns.Add("AverageGf"); dt0.Columns.Add("Averagewaf");
            Console.WriteLine(dt9.Rows.Count);

            for (int i = 0; i < 14; i++)
            {
                double sumS = 0; double sumG = 0; double AverageGf = 0; double swaf = 0; double swbf = 0; double Averagewaf = 0; double Averagewbf = 0;
                for (int j = 0; j < 21; j++)
                {
                    if (Convert.ToInt32(dt9.Rows[j]["PID1"]) == i + 1 || Convert.ToInt32(dt9.Rows[j]["PID2"]) == i + 1 || Convert.ToInt32(dt9.Rows[j]["PID3"]) == i + 1)
                    {
                        sumS += Convert.ToDouble(dt9.Rows[j]["s"]);
                        sumG += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["gf"]);
                    }
                    if (Convert.ToInt32(dt9.Rows[j]["PID1"]) == i + 1)
                    {
                        swaf += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["waf1"]);
                        //swbf += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["wbf1"]);
                    }
                    if (Convert.ToInt32(dt9.Rows[j]["PID2"]) == i + 1)
                    {
                        swaf += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["waf2"]);
                        //swbf += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["wbf2"]);
                    }
                    if (Convert.ToInt32(dt9.Rows[j]["PID3"]) == i + 1)
                    {
                        swaf += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["waf3"]);
                        //swbf += Convert.ToDouble(dt9.Rows[j]["s"]) * Convert.ToDouble(dt9.Rows[j]["wbf3"]);
                    }
                }
                AverageGf = sumG / sumS; Averagewaf = swaf / sumS; //Averagewbf = swbf / sumS;
                DataRow dr = dt0.NewRow(); dr["AverageGf"] = AverageGf; dr["Averagewaf"] = Averagewaf; dt0.Rows.Add(dr);
            }


            string result1 = @"F:\vs\000.txt";                   //输出数据
            FileStream fs = new FileStream(result1, FileMode.Append);
            StreamWriter wr = null;
            wr = new StreamWriter(fs);
            wr.WriteLine("PID,AverageGf,Averagewaf");
            for (int i = 0; i < dt0.Rows.Count; i++)
            {
                wr.WriteLine("{0},{1},{2}", i + 1, dt0.Rows[i]["AverageGf"], dt0.Rows[i]["Averagewaf"]);
            }
            wr.Close();

 注:1.每执行一轮循环后,sumS = 0……都要归零

2.需要新建一个表来存储结果,不能附加在原始数据上,因为数据格式不同。

string sql8 = "select * from A";        //dt8---Fracture  存储断裂面上三角点的指标
            OleDbDataAdapter dbDataAdapter8 = new OleDbDataAdapter(sql8, oleDb);
            DataTable dt8 = new DataTable();
            dbDataAdapter8.Fill(dt8);
            List<Point3D> Fracture = new List<Point3D>();            
            
            for (int i = 0; i < dt8.Rows.Count; i++)
            {
                Point3D Fracture_P = new Point3D();  // 需要在循环体内,否则会被覆盖
                Fracture_P.X = Convert.ToDouble(dt8.Rows[i]["X"]);
                Fracture_P.Y = Convert.ToDouble(dt8.Rows[i]["Y"]);
                Fracture_P.Z = Convert.ToDouble(dt8.Rows[i]["Z"]);
                Fracture.Add(Fracture_P);
            }           

            string sql9 = "select * from B";    //dt9---Know  存储代求块体
            OleDbDataAdapter dbDataAdapter9 = new OleDbDataAdapter(sql9, oleDb);
            DataTable dt9 = new DataTable();
            dbDataAdapter9.Fill(dt9);
            dt9.Columns.Add("PID");
            dt9.Columns.Add("df");
            List<Point3D> Know = new List<Point3D>();
            
            for (int i = 0; i < dt9.Rows.Count; i++)
            {
                Point3D Know_P = new Point3D();
                Know_P.X = Convert.ToDouble(dt9.Rows[i]["X"]);
                Know_P.Y = Convert.ToDouble(dt9.Rows[i]["Y"]);
                Know_P.Z = Convert.ToDouble(dt9.Rows[i]["Z"]);
                Know.Add(Know_P);
            }
            Console.WriteLine(Know.Count);


            for (int i = 0; i < Know.Count; i++)
            {
                double temp = 0; double max = double.MaxValue;
                for (int j = 0; j < Fracture.Count; j++)
                {
                    temp = triangle.PP_DistancePow(Know[i], Fracture[j]);  //计算两点间的距离
                    max = max > temp ? temp : max;  //把max往min迁移
                    if (max == temp)
                    {
                        dt9.Rows[i]["PID"] = j + 1;  //存储最短距离值和对应的点号
                        dt9.Rows[i]["df"] = temp;
                    }
                }
            }

            string result1 = @"F:\vs\测试.txt";                   //输出数据
            FileStream fs = new FileStream(result1, FileMode.Append);
            StreamWriter wr = null;
            wr = new StreamWriter(fs);

            wr.WriteLine("ID,PointID,df");
            for (int i = 0; i < dt9.Rows.Count; i++)
            {
                wr.WriteLine("{0},{1},{2}", dt9.Rows[i]["ID"], dt9.Rows[i]["PID"], dt9.Rows[i]["df"]);
            }
            wr.Close();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值