2016-11-26 68 views
-1

我在Visual Studio中使用c + +,我有一个算法,为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”将不起作用。

相关问题