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

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

     


  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/listen1421/p/12118301.html
Copyright © 2011-2022 走看看