2013-04-13 3 views
1

C++을 사용하여 그래픽 코드를 작성하는 방법을 배우기 시작했습니다. 선형 보간 코드를 컴파일 할 때 코드는 실행되지 않고 VC++을 xmemory 파일로 전송합니다. 오류나 경고가 주어지지 않으므로 작업 할 것이 없습니다. 나는 무엇을 잘못 했는가? 나는 문제가 내가 벡터를 할당하는 방식과 관련이 있다고 생각한다. 그러나 나의 변화는 아무 것도 작용하지 않았다. 나는 내가 답변으로 내 생각을 쓸 것이다 질문에 코멘트를 게시 할 수 없습니다코드가 컴파일되지 않음 - 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); 
} 
+0

당신이 할 수있는만큼 많은 코드를 제거하고 여전히 오류가 있습니다. –

+0

아 맞아! 나는 벡터 할당을 오해했다. InterpolateVec에서 과제를 변경했는데 효과가있었습니다. – Nanaki

답변

0

: 여기

는 코드입니다.

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

그것은 (또는 라이브러리 중 하나) vec2vec3 후를 만들기 위해 float에 대한 operator,를 오버로드 것 같습니다. 내가 바로 다음 이유는 그 값으로 각 구성 요소를 지정하지하고 코드가 비슷한 것입니다 경우 니스 솔루션 :하지만,

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

다시 이것은 단지 가설입니다! 코드를 컴파일하고 오류를 볼 수 없습니다.

나는 왜 i을 사용하고 있는지 이해하지 못합니다. 이는 add과 같습니다.

+0

흥미롭게도이 코드를 우연히 발견하지 못했습니다. 파이썬에서'(1, 2, 3)'는 튜플입니다. C++에서 값 1, 2 및 3을 묶는 쉼표 연산자와 그 주위에 대괄호가 있습니다. 쉼표 연산자는 피연산자를 평가하고 마지막 값을 반환하므로'(1, 2, 3)'은 '3'과 같습니다. –

+0

그 맥락에서 count1 및 count2 평가 무의미하게 보인다, 그래서 거기에 코드를 포함하여 어딘가에 연산자 오버로드 있다고 생각합니다. 만약 내가 옳다면, 오버로드 된 함수는 float과 다른 (아마도) 어떤 것을 반환하고 할당 될 때 에러가 발생합니다. – vlastachu

+0

Wooow 나는 옳다. 내 투시력이 향상되었습니다. – vlastachu

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)과 같은). 나는 그 후로 만들고 있니? 내 어휘는 내가 아는 기술이 아닙니다.

0

또는 시간을 절약하고 glm::vec3glm::vec3으로 처리하도록 할 수 있습니다.

한편, 여기, 쿠키 (을 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; 
    } 

} 
관련 문제