[英]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);
}
我繪制像素的 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 要求的線性插值示例:
還有一個我的“余弦”插值示例:
編輯:好的,所以我已將其完全縮小到余弦插值 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.