為什麼processing坐標系的原點在左上角?

剛剛開始學Processing,發現其坐標系原點在左上角,x軸向右延伸,y軸向下延伸。但是感覺這樣很不方便。請問為什麼這麼規定呢?是為了避免負值嗎?那為什麼又不用笛卡爾坐標系的第一象限呢?而我們又能不能自定義原點和坐標軸正方向呢?


AlexYu 提到了歷史原因,其實還有數學意義上的原因

processing處理的是數字圖像,數字圖像是由像素構成的,所以可以將圖像看作是一個矩陣(Matrix),矩陣的每一個元素對應圖像上同位置的像素點。如600*800的圖像Img對應一個600*800大小的矩陣M,該矩陣的每一個元素值由對應圖像同位置的像素值(顏色等)確定。這樣,從矩陣的角度看,左上角作為起始點是非常合理的,正好對應矩陣上的第0行第0列(從0開始計數),同樣,橫、縱坐標軸的朝向也與矩陣的列與行對應上了,如圖片上第i行第j列的像素與矩陣的元素M[i,j]對應。

通過這樣的設定,在處理圖像問題時,就完全可以轉化為處理矩陣來實現,這在數學和實際程序操作時非常方便,也更加直觀。比如,要對一張圖片進行上下顛倒,則只需將對應的矩陣進行上下顛倒的操作即可。或者需要將圖片進行旋轉一定角度等,也是通過對該矩陣進行相應的矩陣變換來實現的。(processing提供的applyMatrix(),pushMatrix(),popMatrix() 等函數也是為了方便從矩陣的角度處理圖像。)

總的來說,按照現在這樣的設定(也是絕大多數圖像處理時的設定),即原點在左上角,且縱軸向下延伸、橫軸向右延伸,應該是更便捷與合理的。

當然,如果一定要自行更改原點與軸的朝向,可以通translate() 來實現原點移動(如設定到左下角,即translate(0,height-1)),然後在每次涉及到縱坐標時,進行一次縱坐標值y=y*(-1)的操作來實現縱軸朝向的改變(本質上軸的朝向沒有改變,只是增加了一個從習慣的坐標系轉換到程序坐標系的變換)。但不建議這麼做,處理圖像變換等情況會變得非常麻煩,也容易將自己繞糊塗了。

剛開始遇到這種「奇怪」的設定,確實會感覺不方便,也會想著對應到習慣的坐標系中。但建議嘗試接受和習慣這種表達方式,並學會用矩陣的觀點來看待及處理這類問題。畢竟隨著處理的圖像問題變得複雜時,這種表現形式的優勢將更加明顯。

參考書目:Digital Image Processing


歷史原因。

以前的陰極射線管顯示器是從左上開始,一行一行掃描的,就像人閱讀的順序一樣。

後來左手系成為圖形學編程里屏幕坐標系的習慣。


寫多了你就會喜歡上這種奇妙的設定的


OpenGL的設定就是這樣,右手坐標系。有些半瓶子不響一瓶子晃蕩的裝逼犯可能看到OpenGL就只能想到開放的基佬吧,還寫多了就會喜歡上這種設定,說的自己是個過來人似的。


推薦閱讀:

OI、ACM選手在學習CS時有哪些優勢?
25歲 零基礎 想入行IT的困惑?
新手怎樣開發一個谷歌瀏覽器的插件?
ide和編輯器有什麼區別?
IT行業到底是怎麼一回事,是否能科普?如果可以如何科普?

TAG:編程 | Processing編程語言 |