2016-11-26 16 views
-1

Я использую C++ в visual studio, и у меня есть алгоритм, который создает изображение для проблемы моделирования n-тела. сам алгоритм работает, но мне нужно сохранить изображение, чтобы доказать, что оно работает. я попробовал много разных способов (которые были прокомментированы в коде), чтобы попытаться достичь этого. я не очень хорошо знаком с C++, и мне был предоставлен код, поэтому любая помощь или совет были бы весьма признательны.C++: попытка сохранить изображение, созданное в файле .jpg, но изображение не откроется

функция, где я пытаюсь сохранить изображение функция PrintParticle():

#include "stdafx.h" 
#include <iostream> 
#include <ctime> 
#include <math.h> 
#include <cstdio> 
#include <cstdlib> 
#include <fstream> 
#include <windows.h> 

using namespace std; 
#define N 100 
#define G 6.673e-11 
#define TIMESTAMP 1e11 
struct Particle { 
    double rx, ry;//position components 
    double vx, vy;//velocity components 
    double fx, fy;//force components 
    double mass;//mass of the particle 

}; 
Particle Update(Particle p, double timestamp) 
{ 
    p.vx += timestamp*p.fx/p.mass; 
    p.vy += timestamp*p.fy/p.mass; 
    p.rx += timestamp*p.vx; 
    p.ry += timestamp*p.vy; 
    return p; 
} 
void PrintParticle(Particle p) 
{ 
    ofstream fout("particle.jpg"); 
    fout << ("rx == %f ry == %f vx == %f vy == %f mass == %f\n", p.rx, p.ry, p.vx, p.vy, p.mass)<< endl; 
    fout.close(); 

    //FILE *f = fopen("particle.ppm", "w");   // Write image to PPM file. 
    //fprintf(f, "rx == %f ry == %f vx == %f vy == %f mass == %f\n", p.rx, p.ry, p.vx, p.vy, p.mass); 
    //string filename = "/Users/Tasha/Documents/Visual Studio 2015/Projects/n-bodySim/n-bodySim"; 
    //("rx == %f ry == %f vx == %f vy == %f mass == %f\n", p.rx, p.ry, p.vx, p.vy, p.mass)->WriteImage(filename); 
} 
//Reset the forces on particle 
Particle ResetForce(Particle p) 
{ 
    p.fx = 0.0; 
    p.fy = 0.0; 
    return p; 
} 
//Add force to particle a by particle b 
Particle AddForce(Particle a, Particle b) 
{ 
    double EPS = 3E4;  // softening parameter (just to avoid infinities) 
    double dx = b.rx - a.rx; 
    double dy = b.ry - a.ry; 
    double dist = sqrt(dx*dx + dy*dy); 
    double F = (G * a.mass * b.mass)/(dist*dist + EPS*EPS); 
    a.fx += F * dx/dist; 
    a.fy += F * dy/dist; 
    return a; 

} 

int main() 
{ 
    Particle particles[N]; 
    srand(time(NULL)); 
    //randomly generating N Particles 
    for (int i = 0; i < N; i++) { 
     double rx = 1e18*exp(-1.8)*(.5 - rand()); 
     particles[i].rx = rx; 
     double ry = 1e18*exp(-1.8)*(.5 - rand()); 
     particles[i].ry = ry; 
     double vx = 1e18*exp(-1.8)*(.5 - rand()); 
     particles[i].vx = vx; 
     double vy = 1e18*exp(-1.8)*(.5 - rand()); 
     particles[i].vy = vy; 
     double mass = 1.98892e30*rand() * 10 + 1e20; 
     particles[i].mass = mass; 

    } 

    int numberofiterations = 10; 
    int count = 0; 
    while (count < numberofiterations) { 
     for (int i = 0; i < N; i++) 
     { 
      particles[i] = ResetForce(particles[i]); 
      for (int j = 0; j < N; j++) 
      { 
       if (i != j) 
       { 
        particles[i] = AddForce(particles[i], particles[j]); 
       } 

      } 
     } 
     //loop again to update the time stamp here 
     for (int i = 0; i < N; i++) 
     { 
      particles[i] = Update(particles[i], TIMESTAMP); 
     } 
     for (int i = 0; i < N; i++) 
     { 
      PrintParticle(particles[i]); 
     } 
     count++; 
    } 
    return 0; 
} 
+0

Что вы хотите быть в файле изображения? График позиций частиц? На данный момент вы пишете текст в файл изображения, поэтому он не работает. – samgak

+0

Вы когда-нибудь слышали о дискретном косинусном преобразовании (DCT)? Нет? Тогда вы не можете напрямую создавать изображения JPEG. Вы когда-нибудь рассматривали спецификацию PPM и PBM-форматов (переносная растровая карта и растровое изображение)? Здесь вы можете найти https://en.wikipedia.org/wiki/Netpbm_format. Это простой формат, особенно. ASCII, но требует определенных усилий. – LutzL

+2

Если вы собираетесь нарисовать несколько точек, я рекомендую использовать формат векторного изображения SVG. Вы можете просто выводить точки в текстовом формате, подобном тому, как вы сейчас, но с небольшим количеством дополнительного форматирования. Это намного проще, чем использование растрового формата, такого как JPEG, потому что вам не нужно растрировать ваше изображение на массив пикселей. – samgak

ответ

3

JPEG требуется специальный файл-формат, который ваш код не реализует. Я бы посоветовал вам начать поиск библиотеки для работы с этим графическим форматом или реализации собственного кодека.

Просто писать текст в файл и называть его «.jpg» не получится.

 Смежные вопросы

  • Нет связанных вопросов^_^