小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

記一次畫圖出現(xiàn)的小細(xì)節(jié),導(dǎo)致我找了3天多

 新進(jìn)小設(shè)計(jì) 2020-04-25

項(xiàng)目里  要用到畫圖  并且最大化 和常態(tài)都要自適應(yīng) 并且線還能被擦掉 我就沒畫在圖片上(主要是這個(gè)是老大開發(fā)自定義控件  我不知道怎么畫在這個(gè)控件的圖片上。。。),

然后就出現(xiàn)了下圖的運(yùn)算

                        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);//根號(hào)
                        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 );

 

注釋部分為我沒找到原因的時(shí)候?qū)懛?,?dāng)時(shí)我已經(jīng)查看了

ImgXInfo.lineStartPoint
ImgXInfo.MaxHeight
ImgXInfo.MaxHeight
ImgXInfo.MinHeight
ImgXInfo.MinWidth
都是有值 并且不為0(因?yàn)辄c(diǎn)都是我鼠標(biāo)點(diǎn)出來的,我能保證不為0,Max是窗體最大化時(shí)窗體的高和寬,Min是窗體常態(tài)下的高和寬)
但是我最大化后,窗體再切換初始窗口
窗體重繪后就是出不來這條線
我嘗試在切換重繪時(shí)斷點(diǎn) 檢查上面這四項(xiàng)的值是不是為0,但是發(fā)現(xiàn)都不為0
甚至 我手動(dòng)算出了最大化 切換到初始窗口 的各項(xiàng)坐標(biāo)值
寫了一個(gè)死值的畫直線 死值的線畫出來了
我非??鄲? 甚至火大
直到3天過去了
我突然想到 int類型的數(shù)據(jù)精度丟失問題
于是我把所有的數(shù)據(jù)項(xiàng) 拆分出來了 斷點(diǎn) 看看
結(jié)果 就是出現(xiàn)了 問題的根源 下面注釋掉的 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);//根號(hào)
                        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 );

因?yàn)楸怀龜?shù)

ImgXInfo.lineStartPoint.X 比除數(shù) ImgXInfo.MaxWidth小 所以除法運(yùn)算后  int類型結(jié)果為0,0乘以任何數(shù)都得零?。。。?!
然后 x1,x2,y1,y2的最終結(jié)果都是0
這條直線要是能畫出來就出鬼了

然后 建個(gè)控制臺(tái)應(yīng)用程序 重新驗(yàn)證下  并記錄成一個(gè)Demo

總結(jié)
運(yùn)算要注意乘除法運(yùn)算,還要注意各類型的精度丟失問題

 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多