[42Seoul]FDF


FDF - @42Born2Code


Contents

  • Subject
  • 辞書の知識

  • Subject


    MANDATORY
    MinilibXを使用して指定した地図を解析し、スクリーン上に等距離投影を使用して描画します.
    BONUS
  • zoom in, zoom out, shift
  • rotate
  • other projection.
  • 辞書の知識


    MiniLibX


    MiniLibXを使用して画面に表示するため、MiniLibXのmanファイルが与えられます.まずそれを熟知してください.
    MiniLibX 관련 포스팅   
    https://velog.io/@minjune8506/MiniLibX

    isometric projection


    等距離投影は,三次元物体を等軸投影法で二次元に表現する投影方法の一つである.x,y,z座標軸のなす角度はいずれも同じであるか、120度の特性を有する.
    出典:ウィキペディア
    図に示すように、x,y軸を30度回転させ、3次元物体を2次元と表す.

    かいてんへんかんマトリクス

  • 2D
  • x' = xcos⁡\coscos(θ\thetaθ) - ysin⁡\sinsin(θ\thetaθ)
    y' = xsin⁡\sinsin(θ\thetaθ) + ycos⁡\coscos(θ\thetaθ)
    x.y軸を30度回転させるために、回転変換マトリクスを使用したいのですが、2次元ではx'y'の座標がその式と一致します.単位円の半径,coscos sinsin値,三角関数の加算定理を用いて,式を導くことができ,導いてみたほうがよい.
  • 3D
  • x軸回りに回転
    x' = x
    y' = ycos⁡\coscos(θ\thetaθ) - zsin⁡\sinsin(θ\thetaθ)
    z' = ysin⁡\sinsin(θ\thetaθ) + zcos⁡\coscos(θ\thetaθ)
    y軸回りに回転
    x' = xcos⁡\coscos(θ\thetaθ) + zsin⁡\sinsin(θ\thetaθ)
    y' = y
    z' = -xsin⁡\sinsin(θ\thetaθ) + zcos⁡\coscos(θ\thetaθ)
    z軸回りに回転
    x' = xcos⁡\coscos(θ\thetaθ) - ysin⁡\sinsin(θ\thetaθ)
    y' = xsin⁡\sinsin(θ\thetaθ) + ycos⁡\coscos(θ\thetaθ)
    z' = z
    2 Dにおける回転変換行列を3次元行列の積に展開し,以下のように整理できる.この式を使用して軸の周りを回転し、上の2 Dの回転行列を使用して軸を回転させて等距離投影を行います.
    これは,上記の式を導くために必要な数学的知識のリンクである.
    Wikipedia:回転変換マトリックス
    ウィキペディア:三角関数の加算の定理
    Wikipedia:マトリックス乗算

    直線を描くアルゴリズム


    直線を描くアルゴリズムでは、2つのクラスを学びました.
    DDAアルゴリズムとBresenhamアルゴリズム.
    どちらのアルゴリズムも直線を描くときに使用されるアルゴリズムですが、使用する計算方法によって異なります.DDAでは実数型、Bresenhamでは整数型と計算されます.
    したがって,Bresenhamアルゴリズムは,より速く,より効率的に直線を描くことができる.
    しかしこのプロジェクトを行う際には,大量の実数型計算が必要となるため,変換問題でDDAアルゴリズムを選択した.

    DDA Line Drawing Algorithm

    Algorithm DDA(x1, y1, x2, y2) { dx = x2 - x1 dy = y2 - y1 //dx는 x좌표의 차이, dy는 y좌표의 차이 if (abs(dx) > abs(dy)) step = abs(dx) else step = abs(dy) //dx > dy : 기울기가 1보다 작을경우 //dx < dy : 기울기가 1보다 클 경우 xinc = dx / step yinc = dy / step while (i <= step) { put_pixel() x = x + xinc y = y + yinc } }

    Bresenham's Line Drawing Algorithm


    傾きが1未満であれば、撮影する画素が直線の上か下かをブレークポイントpで判断する.詳細な証明とガイドの内容は長く、他の位置決めで処理する必要がある場合があります. Algorithm Bresenham(x1, y1, x2, y2) { x = x1; y = y1; dx = x2 - x1 dy = y2 - y1 p = 2dy - dx while (x <= x2) { put_pixel(x,y) x++ if (p < 0) p = p + 2dy else { p = p + 2dy - 2dx y++ } } }