亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Java2D AWT Frame 中使用世界坐標

在 Java2D AWT Frame 中使用世界坐標

慕絲7291255 2022-07-27 21:35:42
我在嘗試實現世界坐標到設備坐標的轉換時被卡住了?;旧衔蚁肜L制以下世界坐標:    // --- World Coordinates    //    //                  (xmax,ymax)    //      ┌────────────────┐    //      │                │    //      │                │    //      │                │    //      │                │    //      └────────────────┘    // (xmin,ymin)    //    // (xmin,ymin) = (0, 100)    // (xmax,ymax) = (1.5, 2.5)在這本書(第 31 頁)之后,我正在嘗試實現從世界坐標視口移動到設備坐標視口所需的仿射變換。    // Introduction to Computer Graphics Using Java 2D and 3D     // Frank Klawonn, Ed. Springer 2008    // Page 31我準備了一個包含兩個測試的測試類,第一個(剛剛設置int test = 1)測試前兩個轉換為翻轉 Y 軸(原點位于屏幕左上角,而不是左下角)。該測試工作正常,繪制一個矩形和線條來顯示這一點。但是,在切換到包含所有預期轉換的測試 2 時,我得到一個空白屏幕:    // --- 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貢獻1833條經驗 獲得超4個贊

我查看了這本書,發現用法AffineTransform.preConcatenate()令人困惑。我更喜歡使用AffineTransform.concatenate(),因為對我來說這提供了更自然的流程。


讓我們看第一個例子(變換,然后交換 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);

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


對于第二個測試,您可以應用相同的方法:


    // 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);

注意這一點:umin, vmin已經表示左下屏幕坐標和umax, vmax右上屏幕坐標,所以不需要額外的平移或y軸翻轉!

一些結束語:

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

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


查看完整回答
反對 回復 2022-07-27
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號