1

C++ を使用してグラフィックスをコーディングする方法を学び始めたところです。線形補間コードをコンパイルすると、コードが実行されず、VC++ が xmemory ファイルに送信されます。エラーや警告は表示されないため、何もする必要がありません。私は何を間違えましたか?問題はベクトルの割り当て方法に関連していると思われますが、私の変更はどれも機能していません。

コードは次のとおりです。

#include "SDL.h"
#include <iostream>
#include <glm/glm.hpp>
#include <vector>
#include "SDLauxiliary.h"

using namespace std;
using glm::vec3;
using std::vector;

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Surface* screen;

void Draw();

void Interpolate( float a, float b, vector<float>& result ) {

    int i = 0;
    for ( float x=a;x < b+1; ++x )
    {
        result[i] = x;
        i = i + 1;
    }

}

void InterpolateVec( vec3 a, vec3 b, vector<vec3>& resultvec ) {
    int i = 0;    
    for (int add=0; add < 4; ++add) {
        float count1 = (b[add]-a[add])/resultvec.size() + a[add];
        float count2 = (b[add]-a[add])/resultvec.size() + a[add];
        float count3 = (b[add]-a[add])/resultvec.size() + a[add];

        resultvec[i].x = (count1, count2, count3);
        resultvec[i].y = (count1, count2, count3);
        resultvec[i].z = (count1, count2, count3);
        i = i + 1;
    }
}

int main( int argc, char* argv[] )
{
    vector<float> result(10); // Create a vector width 10 floats
    Interpolate(5, 14, result); // Fill it with interpolated values
    for( int i=0; i < result.size(); ++i )
        cout << result[i] << " "; // Print the result to the terminal

    vector<vec3> resultvec( 4 );
    vec3 a(1,4,9.2);
    vec3 b(4,1,9.8);
    InterpolateVec( a, b, resultvec );
    for( int i=0; i<resultvec.size(); ++i )
    {
        cout << "( "
        << resultvec[i].x << ", "
        << resultvec[i].y << ", "
        << resultvec[i].z << " ) ";
    }

    screen = InitializeSDL( SCREEN_WIDTH, SCREEN_HEIGHT );
    while( NoQuitMessageSDL() )
    {
        Draw();
    }
    SDL_SaveBMP( screen, "screenshot.bmp" );

    return 0;
}

void Draw()
{

    for( int y=0; y<SCREEN_HEIGHT; ++y )
    {

        for( int x=0; x<SCREEN_WIDTH; ++x )
        {
            vec3 color(1,0,1);
            PutPixelSDL( screen, x, y, color );
        }
    }

    if( SDL_MUSTLOCK(screen) )
        SDL_UnlockSurface(screen);

    SDL_UpdateRect( screen, 0, 0, 0, 0 );
}
4

3 に答える 3

0

質問にコメントを投稿できないので、回答として私の考えを書きます。

    resultvec[i].x = (count1, count2, count3);
    resultvec[i].y = (count1, count2, count3);
    resultvec[i].z = (count1, count2, count3);

あなた(またはあなたのライブラリの1つ)がto makeと afterをオーバーロードoperator,しているようです。素晴らしい解決策ですが、私が正しければ、各コンポーネントをその値に割り当てる理由はなく、コードは次のようになります。floatvec2vec3

    resultvec[i] = (count1, count2, count3);

繰り返しますが、これは単なる仮説です。コードをコンパイルできず、エラーが表示されます。

iまた、 に等しい を使用する理由がわかりませんadd

于 2013-04-13T14:29:23.887 に答える
0

または、時間を節約して、glm::vec3やるべきことを任せることもできglm::vec3ます。

その間; ここに、Cookie があります ( cookie.png )

void Interpolate(vec3 a, vec3 b, vector<vec3>& result) {  
    vec3 diffStep = (b-a) * (1.0f / (result.size() - 1)); // Operator overloading
    result[0] = vec3(a);                                   
    for(int i = 1; i < result.size(); i++) {
        result[i] = result[i-1] + diffStep;
    }

}
于 2013-04-15T11:46:16.203 に答える
0

コードをコンパイルできなかった人がいるのは奇妙です。ライブラリをインストールしていない可能性があります (n00b の推測、イェーイ ...)。

それで、これを機能させるために私がしたことは次のとおりです(最初のコメントが述べたように、この場合はコードが少ない方が良いです):

void InterpolateVec( vec3 a, vec3 b, vector<vec3>& resultvec ) {
resultvec[0].x = a[0];
resultvec[0].y = a[1];
resultvec[0].z = a[2];

float count1 = (b[0]-a[0])/(resultvec.size() - 1);
float count2 = (b[1]-a[1])/(resultvec.size() - 1);
float count3 = (b[2]-a[2])/(resultvec.size() - 1);

for (int add=1; add < 5; ++add) {
    a[0] = a[0] + count1; 
    a[1] = a[1] + count2; 
    a[2] = a[2] + count3; 
    resultvec[add].x = a[0];
    resultvec[add].y = a[1];
    resultvec[add].z = a[2];
}
 }

私は(何時間も後に...)count1、count2、count3を追加する必要がないことを発見しました。vec3 は、count1 を追加すると、私が望んでいたことを行うようなタイプです。色の割り当て (つまり (0,0,1) のようなもの)。私はそれ以来作っていますか?私の語彙は、私が知っているほど専門的ではありません。

于 2013-04-14T14:01:31.753 に答える