關於座標系統的理解

2021-08-20 14:37:13 字數 1232 閱讀 6039

為什麼使用這兩個概念?

為了讓在邏輯座標下自己作的圖,在視窗大小變換時能自動適應,而不用去管窗體目前(物理上)是多大的。

概念區別

我們先要明白視口和視窗,物理座標和邏輯座標的概念,所謂視口與其物理座標 ,就是指在螢幕上的看到的實際的乙個個畫素和其座標,而所謂視窗和邏輯座標,就是指我們指定了乙個這個窗體的座標系,在這個座標系內做的東西是先在其內畫好,在轉換到物理座標系內去。本來物理座標和邏輯座標顯然是一樣的,除非你呼叫了setwindow方法去設定了邏輯座標。

相關描述

在qpainter中存在setwindow和setviewport,分別用來設定繪圖視窗和繪圖的視口。

首先要說明的是,這個視窗和視口和可能和其它地方說明的視窗和視口含義不一樣,把相關知識描述如下:

以在qwidget中繪圖為例,qwidget大小(600,600)。qt繪圖時,如果不顯式的指定視窗和視口,預設的視窗和視口都是(0,0,widget.width(),widget.height())。那麼視窗-視口變換過程中的線性關係是x』 = x;y』 = y;其中(x,y)是視窗中的座標,(x』,y』)是視口中的座標。那麼此時繪製的圖形是以乙個不變的關係繪製在qwidget上,沒有任何的平移等效果。

如果使用setwindow(-300,-300,600,600)和setviewport(-100,-100,600,600)之後呢,那麼這個視窗-視口的線性關係則需要重新計算了,怎麼計算?

設x』=ax+b;y』=cy+d; 那麼需要確定引數a,b,c,d。如何確定?

使用視窗座標和視口座標進行計算,在視窗(-300,-300,600,600)中,實際上是指定了視窗的兩個座標,左上角(-300,-300),右下角(300,300);在視口(-100,-100,600,600)中,指定了視口左上角座標(-100,-100),視口右下角(500,500).根據左上角對應左上角,右下角對應右下角的關係,得到:x方向上有:-100=-300a+b,500=300a+b,解得a=1,b=200;y方向有:-100=-300c+d,500=300c+d,解得c=1,d=200。得到關係後再來繪圖則是經過該關係變換後的值了。

比如painter.drawpoint(0,10),對應x=0,得到x』=0*a+b=200;對應y=10,得到y』=10*c+d=210;即實際上是在widget的(200,210)處繪製了乙個點。

以上即是qpainter視窗-視口機制的具體計算過程。

關於齊次座標的理解

問題 兩條平行線可以相交於一點 在歐氏幾何空間,同一平面的兩條平行線不能相交,這是我們都熟悉的一種場景。然而,在透視空間裡面,兩條平行線可以相交,例如 火車軌道隨著我們的視線越來越窄,最後兩條平行線在無窮遠處交於一點。歐氏空間 或者笛卡爾空間 描述2d 3d幾何非常適合,但是這種方法卻不適合處理透視...

關於齊次座標的理解

問題 兩條平行線可以相交於一點 在歐氏幾何空間,同一平面的兩條平行線不能相交,這是我們都熟悉的一種場景。然而,在透視空間裡面,兩條平行線可以相交,例如 火車軌道隨著我們的視線越來越窄,最後兩條平行線在無窮遠處交於一點。歐氏空間 或者笛卡爾空間 描述2d 3d幾何非常適合,但是這種方法卻不適合處理透視...

關於齊次座標的理解

問題 兩條平行線可以相交於一點 在歐氏幾何空間,同一平面的兩條平行線不能相交,這是我們都熟悉的一種場景。然而,在透視空間裡面,兩條平行線可以相交,例如 火車軌道隨著我們的視線越來越窄,最後兩條平行線在無窮遠處交於一點。歐氏空間 或者笛卡爾空間 描述2d 3d幾何非常適合,但是這種方法卻不適合處理透視...