第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Java2D AWT Frame 中使用世界坐標(biāo)

在 Java2D AWT Frame 中使用世界坐標(biāo)

慕絲7291255 2022-07-27 21:35:42
我在嘗試實(shí)現(xiàn)世界坐標(biāo)到設(shè)備坐標(biāo)的轉(zhuǎn)換時(shí)被卡住了。基本上我想繪制以下世界坐標(biāo):    // --- World Coordinates    //    //                  (xmax,ymax)    //      ┌────────────────┐    //      │                │    //      │                │    //      │                │    //      │                │    //      └────────────────┘    // (xmin,ymin)    //    // (xmin,ymin) = (0, 100)    // (xmax,ymax) = (1.5, 2.5)在這本書(第 31 頁)之后,我正在嘗試實(shí)現(xiàn)從世界坐標(biāo)視口移動(dòng)到設(shè)備坐標(biāo)視口所需的仿射變換。    // Introduction to Computer Graphics Using Java 2D and 3D     // Frank Klawonn, Ed. Springer 2008    // Page 31我準(zhǔn)備了一個(gè)包含兩個(gè)測試的測試類,第一個(gè)(剛剛設(shè)置int test = 1)測試前兩個(gè)轉(zhuǎn)換為翻轉(zhuǎn) Y 軸(原點(diǎn)位于屏幕左上角,而不是左下角)。該測試工作正常,繪制一個(gè)矩形和線條來顯示這一點(diǎn)。但是,在切換到包含所有預(yù)期轉(zhuǎn)換的測試 2 時(shí),我得到一個(gè)空白屏幕:    // --- Affine Transform 1 and 2    //    //   T(0, h) ? S(1,?1)    //    // --- Affine Transform 3, 4 and 5    //       //                     ╭ umax ? umin   vmax ? vmin ╮    //   T(umin, vmin) ? S | ----------- , ----------- | ? T(-xmin, -ymin)      //                     ╰ xmax ? xmin   ymax ? ymin ╯    //
查看完整描述

1 回答

?
瀟瀟雨雨

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊

我查看了這本書,發(fā)現(xiàn)用法AffineTransform.preConcatenate()令人困惑。我更喜歡使用AffineTransform.concatenate(),因?yàn)閷ξ襾碚f這提供了更自然的流程。


讓我們看第一個(gè)例子(變換,然后交換 y 方向)。


這是你的代碼:


    AffineTransform at1 = new AffineTransform();

    at1.setToScale(1,-1);

    AffineTransform at2 = new AffineTransform();

    at2.setToTranslation(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);

    at1.preConcatenate(at2);

使用 using concatenate,您可以將其寫為:


    AffineTransform at1 = new AffineTransform();

    at1.setToTranslation(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);

    AffineTransform at2 = new AffineTransform();

    at2.setToScale(1,-1);

    at1.concatenate(at2);

或者,甚至更短:


    AffineTransform at = new AffineTransform();

    at.translate(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);

    at.scale(1,-1);

您可以看到代碼中直接表示的“翻譯,然后縮放”流程。


對于第二個(gè)測試,您可以應(yīng)用相同的方法:


    // Affine Transformation 3, 4 and 5

    //                   ╭ umax ? umin   vmax ? vmin ╮

    // T(umin, vmin) ? S | ----------- , ----------- | ? T(-xmin, -ymin)

    //                   ╰ xmax ? xmin   ymax ? ymin ╯

    AffineTransform at = new AffineTransform();

    at.translate(umin, vmin);

    at.scale((umax-umin)/(xmax-xmin), (vmax-vmin)/(ymax-ymin));

    at.translate(-xmin, -ymin);

注意這一點(diǎn):umin, vmin已經(jīng)表示左下屏幕坐標(biāo)和umax, vmax右上屏幕坐標(biāo),所以不需要額外的平移或y軸翻轉(zhuǎn)!

一些結(jié)束語:

  • Java2D 中線的默認(rèn)寬度是一個(gè)縮放單位。選擇yminymax后,一個(gè)縮放單位會(huì)填滿窗口的整個(gè)高度。g2d.setStroke(new BasicStroke(0.0f));為了不只得到一個(gè)填充的矩形,您應(yīng)該在調(diào)用之前將線寬設(shè)置為可能的最小值g2d.draw()

  • 的參數(shù)Rectangle2D.Double()x, y, w, h,因此您在第二個(gè)示例中創(chuàng)建矩形對象的代碼可能應(yīng)該讀取Rectangle2D.Double rectangle = new Rectangle2D.Double(0, 1.5, 100, 1);(高度為 2.5,上邊框不會(huì)顯示在屏幕上)。


查看完整回答
反對 回復(fù) 2022-07-27
  • 1 回答
  • 0 關(guān)注
  • 125 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)