记一次画图出现的小细节,导致我找了3天多
程序员文章站
2022-06-11 16:27:14
项目里 要用到画图 并且最大化 和常态都要自适应 并且线还能被擦掉 我就没画在图片上(主要是这个是老大开发自定义控件 我不知道怎么画在这个控件的图片上。。。), 然后就出现了下图的运算 var x1 = ImgXInfo.lineStartPoint.X * ImgXInfo.MaxWidth / ......
项目里 要用到画图 并且最大化 和常态都要自适应 并且线还能被擦掉 我就没画在图片上(主要是这个是老大开发自定义控件 我不知道怎么画在这个控件的图片上。。。),
然后就出现了下图的运算
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
总结
运算要注意乘除法运算,还要注意各类型的精度丢失问题
上一篇: 切开的牛油果怎么保存,切开太生怎么办呢
下一篇: 减肥喝汤?别再被骗了,减肥不能只靠喝汤!