項目里 要用到畫圖 並且最大化 和常態都要自適應 並且線還能被擦掉 我就沒畫在圖片上(主要是這個是老大開發自定義控制項 我不知道怎麼畫在這個控制項的圖片上。。。), 然後就出現了下圖的運算 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
總結
運算要註意乘除法運算,還要註意各類型的精度丟失問題