标题:关于数据位数出现的问题?
只看楼主
nmdiszt
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-4-27
结帖率:0
已结贴  问题点数:20 回复次数:1 
关于数据位数出现的问题?

已知两个点:(tx1,ty1),(tx,ty)画一直线,
还有一个以点(tx0,ty0)为圆心,r为半径的圆,要求得到圆与折线相交的第一个点!
现在知道这两个点到圆心的距离,一个大于r,一个小于r。(保证直线与圆有两个交点)
现在编程序运行,一般的点值都能运算出来,基本正确,
只是当计算时出现double值位数错误,甚至有b2-4ac小于0的情况(这是不可能的,因为两点到圆心距离是一长一短!),知道是运算时x0和x1太接近,做分母产生巨大数据,引起的计算失误,有哪位大侠给分析一下,如何解决?
重要的是:还有就是b2-4ac虽然大于0,但是得到的(x0,y0),(x1,y1)不在(tx1,ty1),(tx,ty)范围之内(这是不可能的, 因为两点到圆心距离是一长一短!),这种情况是由于位数不够引起的,如何调整位数?我的tx,ty,tx1,ty1,tx0,ty0都是大地坐标,整数位 为六到七位。
程序代码:
public const int weishu = 1000000;

 public const int bushu = 100000;

 public static int jiadian = 0;
         


 NumberFormatInfo thisnumberformatinfo = new CultureInfo("en-US", false).NumberFormat;

 thisnumberformatinfo.NumberDecimalDigits = 90;          

                   double tx = 0,ty = 0,tx0 = 0,ty0 = 0,tx1 = 0,ty1 = 0;
                    double px = 0,py = 0,px0 = 0,py0 = 0,px1 = 0,py1 = 0;
                    int t=0;
                    int bianweishu = weishu;                                

                        for (int i1 = 0; i1 < numpoint1; i1++)
                        {
                            tx = 0;
                            ty = 0;
                            BinaryFile1.BaseStream.Seek(152 + gg + numpart1 * 4 + i1 * 16, 0);(提取tx)
                            tx = Convert.ToDouble(BinaryFile1.ReadDouble());
                            tx = tx * bianweishu;
                            BinaryFile1.BaseStream.Seek(152 + gg + numpart1 * 4 + i1 * 16 + 8, 0);(提取ty)
                            ty = Convert.ToDouble(BinaryFile1.ReadDouble());
                            ty = ty * bianweishu;                          

                            if (i1 == 0 && t == 0)
                            {
                                tx0 = tx;
                                ty0 = ty;
                                tx1 = tx;
                                ty1 = ty;
                                px1 = tx;
                                py1 = ty;
                                px0 = tx;
                                py0 = ty;
                            }
                            else
                            {
  double changdu = Math.Sqrt((tx - tx0) * (tx - tx0) + (ty - ty0) * (ty - ty0));
                                if (changdu < banjing)
                                {
                                    tx1 = tx;
                                    ty1 = ty;
                                    if (i1 == (numpoint1 - 1) && (t == 0))
                                    {
                                        MessageBox.Show("没有交点,不创建文件!");
                                        System.Environment.Exit(0);

                                    }
                                }
                                else
                                {
                                    double aa = (tx - tx1) * (tx - tx1) + (ty - ty1) * (ty - ty1);
                                    if (aa != 0)
                                    {
                                        double b = 0;
                                        double c = 0;
                                        double x0 = 0;
                                        double y0 = 0;
                                        double x1 = 0;
                                        double y1 = 0;
                                        double s = 0;
                                        if (tx == tx1)
                                        {
                                            x0 = tx;
                                            y0 = ty + banjing;
                                            x1 = tx;
                                            y1 = ty - banjing;
                                        }
                                        else
                                        {  double a = 0;
                                            a = 1 + (ty - ty1) * (ty - ty1) / ((tx - tx1) * (tx - tx1));
                                            b = (ty - ty1) / (tx - tx1) * ((ty1 * tx - ty * tx1) / (tx - tx1) - ty0) - tx0;
                                            double d = ((ty1 * tx - ty * tx1) / (tx - tx1) - ty0);
                                            double dd = d * d;
                                            c = tx0 * tx0 - banjing * banjing + dd;
                                            double bb = b * b;
                                            double ac = a * c;
                                            s = b * b - a * c;
                                            //s = (2 * tx0 * (ty - ty1) * (ty0 * tx - ty0 * tx1 - ty1 * tx + ty * tx1)
                                            //    + (ty1 * tx - ty * tx1) * (2 * tx * ty0 - 2 * tx1 * ty0 - ty1 * tx + ty * tx1)
                                            //    - tx0 * tx0 * (ty - ty1) * (ty - ty1) - ty0 * ty0 * (tx - tx1) * (tx - tx1)
                                            //    + banjing * banjing * ((ty - ty1) * (ty - ty1) + (tx - tx1) * (tx - tx1))) / ((tx - tx1) * (tx - tx1));
                                            if (s > 0)
                                            {
                                                x0 = (-b + Math.Sqrt(s)) / a;
                                                y0 = (ty - ty1) * (x0 - tx1) / (tx - tx1) + ty1;
                                                x1 = (-b - Math.Sqrt(s)) / a;
                                                y1 = (ty - ty1) * (x1 - tx1) / (tx - tx1) + ty1;
                                            }
                                            else
                                            {
///////?????????////
                                            }
                                        }
   double maxx = 0, maxy = 0, minx = 0, miny = 0;
                                        if (tx > tx1)
                                        {
                                            maxx = tx;
                                            minx = tx1;
                                        }
                                        else
                                        {
                                            maxx = tx1;
                                            minx = tx;
                                        }
                                        if (ty > ty1)
                                        {
                                            maxy = ty;
                                            miny = ty1;
                                        }
                                        else
                                        {
                                            maxy = ty1;
                                            miny = ty;
                                        }

                                        px1 = px0;
                                        py1 = py0;
                                        if (t != 0)
                                        {
                                            px0 = px;
                                            py0 = py;
                                        }
                                        double julix0 = (px1 - x0) * (px1 - x0) + (py1 - y0) * (py1 - y0);
                                        double julix1 = (px1 - x1) * (px1 - x1) + (py1 - y1) * (py1 - y1);

                                        if (julix0 > julix1)
                                        {
                                            if (((x0 >= minx) && (x0 <= maxx)) && ((y0 >= miny) && (y0 <= maxy)))
                                            {
                                                px = x0;
                                                py = y0;
                                               

                                            }
                                            else
                                            {

                                                if (((x1 >= minx) && (x1 <= maxx)) && ((y1 >= miny) && (y1 <= maxy)))
                                                {
                                                    px = x1;
                                                    py = y1;
                                                   

                                                }
                                                else
                                                {                                           

                                                 MessageBox.Show("错误!");
                                                            System.Environment.Exit(0);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if (((x1 >= minx) && (x1 <= maxx)) && ((y1 >= miny) && (y1 <= maxy)))
                                            {
                                                px = x1;
                                                py = y1;
                                               

                                            }
                                            else
                                            {
                                                if (((x0 >= minx) && (x0 <= maxx)) && ((y0 >= miny) && (y0 <= maxy)))
                                                {
                                                    px = x0;
                                                    py = y0;
                                                   

                                                }
                                                else
                                                {
                                                   

                                                            MessageBox.Show("错误!");
                                                            System.Environment.Exit(0);                                                   

                                                }
                                            }
                                        }

                                        t = t + 1;
                                        tx0 = px;
                                        ty0 = py;
                                        i1 = i1 - 1;
           }
         }
      }

 }
}

搜索更多相关主题的帖子: double 如何 
2013-03-07 16:49
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:20 
既然知道原因了,那就应该知道怎么处理啊
double类型的计算原本就会存在问题,如果double装不下,可以采用比double更大的数据类型,如果是计算有误,就不要直接乘除了,C#有提供精确计算的方法的。程序逻辑我没有细看,你能写出这些代码,解决这样的问题应该不算难
2013-03-11 18:41



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




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

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