專案里 要用到畫圖 并且最大化 和常態都要自適應 并且線還能被擦掉 我就沒畫在圖片上(主要是這個是老大開發自定義控制元件 我不知道怎么畫在這個控制元件的圖片上,,,),
然后就出現了下圖的運算
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

總結
運算要注意乘除法運算,還要注意各型別的精度丟失問題

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/2952.html
標籤:ASP.NET
