關於矢量仿射變換js代碼的信息

本文目錄一覽:

利用java實現圖片翻轉的代碼

重載渲染控件的paintComponent(Graphics g)方法.

設你當前圖像實例為img,已初始化,需要旋轉的角度為ang

public void paintComponent(Graphics g){

super.paintCompoent(g);

Graphics2D g2d = (Graphics2D)g;

g2d.rotate(-angle);

g2d.drawImage(img,0,0,this.getWidth(),this.getHeight(),null);

}

Graphics,Graphics2D 類中有對當前描繪環境進行仿射變換的方法,包括translate,scale,rotate,也可以直接設置仿射變換矩陣,利用這點就可以根據所需要的實現方式來進行描繪.

2. threejs源碼閱讀——math/matrix

與 Vector接口 一樣,threejs也在 Matrix3.d.ts 文件中提供了一個 Matrix 接口,並且在 Matrix3 (3×3矩陣類)和 Maxtrix4 (4×4矩陣類)中實現了該接口。

我們可以看到,矩陣中的元素是用數組的方式儲存的。由於不同維度的矩陣內所用的元素個數不同,所以Matrix3和Matrix4的set方法是分開聲明在每個類中的。這裡我們以Matrix3.set為例:

可以看到,在set時是以行優先的順序進行傳值的,也就是第一行第一個,第一行第二個,第一行第三個,第二行第一個,第二行第二個…

但是在set方法的實現中,可以看到elements數組內是以列優先的順序進行存儲的:

簡單點說,這裡只是 存儲方式的不同 。由於大多數人都習慣以行優先的方式考慮矩陣,所以threejs中所有的文檔都是以行優先的方式表示的。但如果我們想要閱讀源碼,就要注意到[n11, n12, n13, n21 … n33]並不是按順序儲存在elements中。事實上如果我們按順序讀取elements中的元素並以行優先的方式組成矩陣,它將是原本矩陣的轉置矩陣。

如同Vector的類型,Matrix類型中所有返回值為自身類對象的方法也是原地修改該對象。例如 Transpose轉置

所有的Matrix也提供了clone和copy方法,用於深拷貝不同Matrix對象。

那麼threejs中的向量與矩陣進行計算是以什麼形式進行的呢?這裡我們舉一個例子。

在Vector3類中提供了appyMatrix3這個方法,這個方法以一個3×3的矩陣作為參數,相乘後原地修改向量的值。

如果我們將Vector3看做 三行一列的矩陣(3×1) 的話,那麼就需要左乘3×3矩陣,最後得到列向量:

如果我們將Vecot3看做 一行三列的矩陣(1×3) 的話,那麼就需要右乘3×3矩陣,最後得到行向量:

接下來,我們再假設一個向量

加入齊次坐標w=1,來表示三維空間中的一個點(1,2,3)

然後我們構建一個仿射變換矩陣做縮放+平移運算

即沿着xyz軸均縮放2倍,然後沿着xyz移動5個單位距離。最終結果是:

這個計算我們會使用Vector3.applyMatrix4

接下來驗證一下:

控制台打印結果:

threejs中的矩陣以 行優先 的形式初始化,以 列優先 的形式儲存。

threejs中的向量採用 列向量 ,與矩陣做 左乘運算 。

threejs中一個三維向量與4×4的矩陣進行運算時,會先給三維向量補充第四個值w,也就是齊次坐標,w值與矩陣的第四行有關係:

在上面的例子中,我們使用了一個縮放+平移的 仿射變換矩陣 作為例子,此時w為1。

labview怎麼對圖片仿射變換

使用視覺運動控制軟件對圖片仿射變換。

仿射變換,是指在幾何中一個向量空間進行一次線性變換並接上一個平移,變換為另一個向量空間,即在幾何上定義為兩個向量空間之間的一個仿射變換或者仿射映射,由一個非奇異的線性變換接上一個平移變換組成。

LabVIEW是一種程序開發環境,由美國國家儀器NI公司研製開發,與其他計算機語言的顯著區別是,其他計算機語言都是採用基於文本的語言產生代碼,而LabVIEW使用的是圖形化編輯語言G編寫程序,產生的程序是框圖的形式。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/301675.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:09
下一篇 2024-12-30 16:09

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29

發表回復

登錄後才能評論