版本 79bea9b7f42b44de2e23a20e1a7c53398a2e8427
Changes from 79bea9b7f42b44de2e23a20e1a7c53398a2e8427 to 72d901aa7ec1799678a7d711365d3ecea3900dfe
---
title: 2016q1 Homework #2
toc: no
...
預期目標
------------
- 學習效能分析工具
- 學習 GNU Toolchain
- 透過視覺化找出
標注須知
-------
下方只要是 `$ ` 開頭,就表示在 GNU/Linux 的終端機裡面輸入的指令,比方說 `$ sudo apt-get update`,就表示要輸入 `sudo apt-get update`。
預先準備動作
-------------------
* 參照 [2016q1: Homework1](/embedded/2016q1h1) 的指示,在實體機器安裝 GNU/Linux 和相關的開發套件
- 注意: 不得透過虛擬機器,因為我們在意實際機器上的效能
* 安裝以下開發工具
```
$ sudo apt-get update
$ sudo apt-get install graphviz
$ sudo apt-get install imagemagick
```
光影追蹤程式
---------------------------
* 光線追蹤 (Ray tracing) 是三維電腦圖形學中的描繪演算法 (rendering algorithm),跟蹤從眼睛發出的光線,而非是光源發出的光線,藉由預先編排好的場景,以數學模型顯現出來,可得到類似於光線投射與掃描線描繪方法的結果,對於反射與折射,可有更準確的模擬效果,效率非常高,所以當追求高品質的效果時,經常使用這種方法
* 在物理學中,光線追跡可以用來計算光束在介質中傳播的情況。在介質中傳播時,光束可能會被介質吸收,改變傳播方向或者射出介質表面等。我們通過計算理想化的窄光束(光線)通過介質中的情形來解決這種複雜的情況
* 在實際應用中,可將各種電磁波或者微小粒子看成理想化的窄波束(即光線),基於這種假設,人們利用光線追跡來計算光線在介質中傳播的情況。光線追跡方法首先計算一條光線在被介質吸收,或者改變方向前,光線在介質中傳播的距離,方向以及到達的新位置,然後從這個新的位置產生出一條新的光線,使用同樣的處理方法,最終計算出一個完整的光線在介質中傳播的路徑
* 成大資訊系師生合作開發原始程式碼僅 650 行的光線追蹤 C 語言程式: [raytracing](https://github.com/embedded2016/raytracing)
* 取得原始程式碼、編譯和測試:
```
$ git clone https://github.com/embedded2016/raytracing.git && cd raytracing
$ make
$ ./raytracing
```
出現 `# Rendering scene` 字樣後,請保持耐心,等待程式輸出 `Done!` 字樣,參考輸出:
```
Execution time of raytracing() : 2.994175 sec
```
* [raytracing](https://github.com/embedded2016/raytracing) 程式執行完畢,將輸出名為 `out.ppm` 的檔案,可透過 `eog` 或在圖形界面點擊開啟。參考輸出:
![alt text](/embedded/2016q1h2/raytracing.png)
參考資料
-------
* [Ray tracing](https://en.wikipedia.org/wiki/Ray_tracing_(graphics))