打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
记一次画图出现的小细节,导致我找了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

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

 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
了解 JS 压缩图片,这一篇就够了
MFC中BMP图片旋转任意角度、用于绘制模拟时钟表针
Jquery UI dialog 详解 (中文)
Flutter 压缩图像的最佳方式【Flutter专题23】
用php或js获取图片大小,高宽尺寸
jQuery 动态调整图片大小
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服