zoukankan      html  css  js  c++  java
  • 记一次画图出现的小细节,导致我找了3天多

    项目里  要用到画图  并且最大化 和常态都要自适应 并且线还能被擦掉 我就没画在图片上(主要是这个是老大开发自定义控件  我不知道怎么画在这个控件的图片上。。。),

    然后就出现了下图的运算

                            var x1 = ImgXInfo.lineStartPoint.X * ImgXInfo.MaxWidth / ImgXInfo.MinWidth;
                            var y1 = ImgXInfo.lineStartPoint.Y * ImgXInfo.MaxHeight / ImgXInfo.MinHeight;
                            var x2 = ImgXInfo.lineEndPoint.X * ImgXInfo.MaxWidth / ImgXInfo.MinWidth;
                            var y2 = ImgXInfo.lineEndPoint.Y * ImgXInfo.MaxHeight / ImgXInfo.MinHeight;
                            e.Graphics.DrawLine(p,x1,y1,x2,y2);
                            int width = x2 - x1;
                            int height = y2 - y1;
                            int result = (width * width) + (height * height);
                            res = Math.Sqrt(result);//根号
                            ImgXInfo.Linelength =Convert.ToInt32(res);
                            //e.Graphics.DrawLine(p, ImgXInfo.lineStartPoint.X / ImgXInfo.MinWidth* ImgXInfo.MaxWidth , ImgXInfo.lineStartPoint.Y / ImgXInfo.MinHeight* ImgXInfo.MaxHeight , ImgXInfo.lineEndPoint.X / ImgXInfo.MinWidth* ImgXInfo.MaxWidth , ImgXInfo.lineEndPoint.Y / ImgXInfo.MinHeight* ImgXInfo.MaxHeight );

    注释部分为我没找到原因的时候写法,当时我已经查看了

    ImgXInfo.lineStartPoint
    ImgXInfo.MaxHeight
    ImgXInfo.MaxHeight
    ImgXInfo.MinHeight
    ImgXInfo.MinWidth
    都是有值 并且不为0(因为点都是我鼠标点出来的,我能保证不为0,Max是窗体最大化时窗体的高和宽,Min是窗体常态下的高和宽)
    但是我最大化后,窗体再切换初始窗口
    窗体重绘后就是出不来这条线
    我尝试在切换重绘时断点 检查上面这四项的值是不是为0,但是发现都不为0
    甚至 我手动算出了最大化 切换到初始窗口 的各项坐标值
    写了一个死值的画直线 死值的线画出来了
    我非常苦恼 甚至火大
    直到3天过去了
    我突然想到 int类型的数据精度丢失问题
    于是我把所有的数据项 拆分出来了 断点 看看
    结果 就是出现了 问题的根源 下面注释掉的 x1,x2,y1,x2
                            var x1 = ImgXInfo.lineStartPoint.X * ImgXInfo.MaxWidth / ImgXInfo.MinWidth;
                            var y1 = ImgXInfo.lineStartPoint.Y * ImgXInfo.MaxHeight / ImgXInfo.MinHeight;
                            var x2 = ImgXInfo.lineEndPoint.X * ImgXInfo.MaxWidth / ImgXInfo.MinWidth;
                            var y2 = ImgXInfo.lineEndPoint.Y * ImgXInfo.MaxHeight / ImgXInfo.MinHeight;
                            //var x1 = ImgXInfo.lineStartPoint.X / ImgXInfo.MinWidth * ImgXInfo.MaxWidth ;
                            //var y1 = ImgXInfo.lineStartPoint.Y / ImgXInfo.MinHeight * ImgXInfo.MaxHeight ;
                            //var x2 = ImgXInfo.lineEndPoint.X / ImgXInfo.MinWidth * ImgXInfo.MaxWidth ;
                            //var y2 = ImgXInfo.lineEndPoint.Y / ImgXInfo.MinHeight * ImgXInfo.MaxHeight ;
                            e.Graphics.DrawLine(p,x1,y1,x2,y2);
                            int width = x2 - x1;
                            int height = y2 - y1;
                            int result = (width * width) + (height * height);
                            res = Math.Sqrt(result);//根号
                            ImgXInfo.Linelength =Convert.ToInt32(res);
                            //e.Graphics.DrawLine(p, ImgXInfo.lineStartPoint.X / ImgXInfo.MinWidth* ImgXInfo.MaxWidth , ImgXInfo.lineStartPoint.Y / ImgXInfo.MinHeight* ImgXInfo.MaxHeight , ImgXInfo.lineEndPoint.X / ImgXInfo.MinWidth* ImgXInfo.MaxWidth , ImgXInfo.lineEndPoint.Y / ImgXInfo.MinHeight* ImgXInfo.MaxHeight );

    因为被除数

    ImgXInfo.lineStartPoint.X 比除数 ImgXInfo.MaxWidth小 所以除法运算后  int类型结果为0,0乘以任何数都得零!!!!!
    然后 x1,x2,y1,y2的最终结果都是0
    这条直线要是能画出来就出鬼了

    然后 建个控制台应用程序 重新验证下  并记录成一个Demo

    总结
    运算要注意乘除法运算,还要注意各类型的精度丢失问题

     


  • 相关阅读:
    关于 self 和 super 在oc 中 的疑惑 与 分析
    面向对象总结
    OC面向对象的三大特征
    Web jsp开发学习——Servlet提交表单时用法
    Web jsp开发学习——Servlet提交表单时用法
    Web jsp开发学习——点击菜单页面切换
    Web jsp开发学习——点击菜单页面切换
    珍藏的数据库SQL基础练习题答案
    珍藏的数据库SQL基础练习题答案
    数据库SQL语言学习--上机练习3(插入 更新 删除)
  • 原文地址:https://www.cnblogs.com/listen1421/p/12118301.html
Copyright © 2011-2022 走看看