項目裏 要用到畫圖 而且最大化 和常態都要自適應 而且線還能被擦掉 我就沒畫在圖片上(主要是這個是老大開發自定義控件 我不知道怎麼畫在這個控件的圖片上。。。),spa
而後就出現了下圖的運算code
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 );
註釋部分爲我沒找到緣由的時候寫法,當時我已經查看了blog
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
總結
運算要注意乘除法運算,還要注意各種型的精度丟失問題