天天看點

程式化生成三角形

  1. 分析世界坐标,找出世界坐标的X軸的Y軸及其正負方向;
  2. 擷取世界坐标系下的機關長度大小,以供後續繪制三角形使用;
  3. 利用世界坐标系下的機關長度大小,定義三角形的三個頂點,若需要将斜邊放置在軸上,則采用勾股定理求出斜邊長度并對其頂點坐标進行設定即可;
  4. 使用相關API繪制三個頂點所定義的三角形;
  5. 添加三角形三個頂點在三角形自身局部坐标系下的縮放系數,并将其定義為公共參數;
  6. 添加三角形三個頂點在三角形自身局部坐标系下的偏移系數,并将其定義為公共參數;(也可根據世界坐标系下三角形生成的位置對其加以移動,縮放亦然);
  7. 使用偏移參數将生成的三角形放置在父物體的特定部位,比如:邊緣處;
  8. 針對局部坐标系下三角形的自轉,可直接設定其旋轉角度;
  9. 然而,為使三角形能夠跟着其父物體一同旋轉的同時還繞着父物體公轉,每次旋轉時對三角形的位置進行重新設定,使用如下數學公式修正三角形的位置[​

    ​theta為旋轉角度,注意使用弧度制​

    ​]:
RelativeLocation.x = (originalPosX - parentPosX) * math.cos(math.rad(theta)) - (originalPosY - parentPosY) * math.sin(math.rad(theta)) + parentPosX
   RelativeLocation.y = (originalPosX - parentPosX) * math.sin(math.rad(theta)) + (originalPosY - parentPosY) * math.cos(math.rad(theta)) + parentPosY
   --RelativeLocation.z = SOME_VALUE      
  1. 生成多個三角形,可以選擇直接在一邊生成的方式,此時可以建構等差數列​

    ​an=a1+(n-1)*d​

    ​,其中,a1為初始的偏移參數,d為每個三角形之間的間距,an将作為累加的偏移項作用于每個生成的三角形上:
local sizeFactor = 1 --縮放倍率

    local p1 = {x = -sizeFactor*(math.sqrt(2))*ONE, y = 0, z = 0}
    local p2 = {x = 0, y = 0,  z = 0}
    local p3 = {x = -sizeFactor*(math.sqrt(2)/2)*ONE,  y = sizeFactor*(math.sqrt(2)/2)*ONE, z = 0}

    local a1, d = 0, (math.sqrt(2)*ONE+interval) --建構等差數列: an = a1 + (n-1)*d
    for i = 1, count do
        local an = (i-1)*d
        local A = {x = p1.x - an, y = p1.y,  z = 0}
        local B = {x = p2.x - an, y = p2.y,  z = 0}
        local C = {x = p3.x - an, y = p3.y,  z = 0}
        DrawTriangle(A, B, C)
    end      
  1. 生成多個三角形也可以選擇在兩邊生成的方式:
local sizeFactor = 1 --縮放倍率
    
    local p1 = {x = -sizeFactor*(math.sqrt(2)/2)*ONE, y = 0,  z = 0}
    local p2 = {x = sizeFactor*(math.sqrt(2)/2)*ONE, y = 0, z = 0}
    local p3 = {x = 0,  y = sizeFactor*(math.sqrt(2)/2)*ONE, z = 0}

    local a1, d = 0, (math.sqrt(2)*ONE+interval) --建構等差數列: an = a1 + (n-1)*d
    local CreateTriangleOnSide = function(side)
        for i = 1, math.floor(count/2) do
            local an = i*d*side
            local A = {x = p1.x - an, y = p1.y,  z = 0}
            local B = {x = p2.x - an, y = p2.y,  z = 0}
            local C = {x = p3.x - an, y = p3.y,  z = 0}
            DrawTriangle(A, B, C)
        end
    end
    --中間生成一個,然後兩邊分别生成--
    local SIDE = {LEFT = -1, RIGHT = 1} --生成左右兩邊專用枚舉
    DrawTriangle(p1, p2, p3)
    CreateTriangleOnSide(SIDE.LEFT)
    CreateTriangleOnSide(SIDE.RIGHT)