簡體   English   中英

余弦插值渲染為線性插值

[英]Cosine interpolation Rendering as Linear Interpolation

我正在嘗試在點之間創建不同的插值方法。 到目前為止,我的線性插值下降了,但我的余弦插值似乎呈現為線性,所以我有一些非常錯誤的地方。 我正在使用 C++ 進行編碼並使用 SFML 進行渲染

我的線性插值 function 是:

sf::Vector2f game::linearInterpolate(sf::Vector2f a, sf::Vector2f b, float randN) {
        return sf::Vector2f(a.x * (1 - randN) + b.x * randN,
            a.y * (1 - randN) + b.y * randN);
}

其中a是插值點,b是插值點,randN是隨機數。 對於那些不熟悉 sfml 的人來說,vector2f 只是兩個浮點數的向量,它們是要繪制的像素的坐標

我的余弦插值 function。 我認為這里出了點問題,因為它似乎返回了線性插值 function 坐標,但是從我所見過的每一個資源中,數學都是正確的(我認為)

sf::Vector2f game::cosineInterpolate(sf::Vector2f a, sf::Vector2f b, float randN) {
    float ft = randN * 3.1415927f;
    float f = (1 - cos(ft)) * 0.5f;

    return sf::Vector2f(a.x * (1-f) + b.x * f,
        a.y * (1 - f) + b.y * f);
    
}

從本教程中找到: https://web.archive.org/web/20160530124230/http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

我繪制像素的 function 是:

//For each point to interpolate between:
    for (sf::Vector2f &l : this->noiseSpots) {
        
        //How many pixels between each point:
        for (unsigned long xScreen = 0; xScreen < 1000; xScreen++) {
            //random number between 0 and one
            float r = this->rand01();
            
            //calculate points to draw
            sf::Vector2f lInterpolatedVec = linearInterpolate(l, this->noiseSpots.at(a + 1), r);
            sf::Vector2f coInterpolatedVec = cosineInterpolate(l, this->noiseSpots.at(a + 1), r);

            //draw linear interpolated graph
            this->graph.setPixel(lInterpolatedVec.x, lInterpolatedVec.y, sf::Color(255, 255, 255));
            //draw cosine interpolated graph
            this->graph.setPixel(coInterpolatedVec.x, coInterpolatedVec.y, sf::Color(255, 0, 0));
        }
        if (a < fidelity-1) { a++; }else{};
    }

noiseSpots 是每個點的插值向量,保真度是這些點的數量。

我想我可能需要將余弦 function 調用放在像素繪圖循環之外,但我不確定如何實現這一點。

PS:在任何人問之前,由於某種原因,std::next 無法訪問我向量中的下一個元素,所以我使用這個解決方法,從 0 開始並增加每次迭代,這就是為什么會有那種丑陋的this->noiseSpots.at(a + 1)

molbdino 要求的線性插值示例:

molbdino 要求的線性插值示例

還有一個我的“余弦”插值示例:

還有我的“余弦”插值示例

編輯:好的,所以我已將其完全縮小到余弦插值 function,因為我可以通過用 randN 替換 1 個或多個 f 值來獲得曲線,但我仍然不確定為什么我不能讓該死的余弦插值工作

好吧,事實證明我是個白痴,在你花幾天時間試圖自己解決這個問題之前,先從我的錯誤中學習。

不要在兩個軸上進行余弦插值:

sf::Vector2f game::cosineInterpolate(sf::Vector2f a, sf::Vector2f b, float randN) {
    float ft = randN * 3.1415927f;
    float f = (1 - cos(ft)) * 0.5f;

    return sf::Vector2f(a.x * (1-f) + b.x * f,
        a.y * (1 - f) + b.y * f);
    
}

應該:

sf::Vector2f game::cosineInterpolate(sf::Vector2f a, sf::Vector2f b, float randN) {
    float ft = randN * 3.1415927f;
    float f = (1 - cos(ft)) * 0.5f;

    return sf::Vector2f(a.x * (1-randN) + b.x * randN,
        a.y * (1 - f) + b.y * f);
    
}

如果你在 x 軸而不是 Y 軸上這樣做,你會得到相反方向的余弦波。 如果你兩者都做(就像我一樣),波浪會抵消,你會得到一條直線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM