Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//
// particles_STL.cpp
// input particles, output STL
// (c) MIT CBA Neil Gershenfeld 6/16/20
// reads from stdin, writes to stdout
// particle_source | particles_STL size
// size is the particle size relative to the input pitch
//
// includes
//
#include <iostream>
#include <string>
using namespace std;
//
// variables
//
int particles,triangles;
char buf[80];
float d,xmin,xmax,ymin,ymax,zmin,zmax;
float *px,*py,*pz;
float zero = 0;
//
// output triangle
//
void output(float x0,float x1,float x2,
float y0,float y1,float y2,
float z0,float z1,float z2) {
cout.write((char *)&zero,4); // normal
cout.write((char *)&zero,4);
cout.write((char *)&zero,4);
cout.write((char *)&x0,4); // vertices
cout.write((char *)&y0,4);
cout.write((char *)&z0,4);
cout.write((char *)&x1,4);
cout.write((char *)&y1,4);
cout.write((char *)&z1,4);
cout.write((char *)&x2,4);
cout.write((char *)&y2,4);
cout.write((char *)&z2,4);
cout.write((char *)&zero,2); // attribute
}
//
// main
//
int main(int argc, char** argv) {
if (argc != 2) {
cerr << "command line: particle_source | particles_STL size" << endl;
return 1;
}
float size = stof(argv[1]);
//
// read and parse inputs
//
string s;
while (1) {
getline(cin,s);
if (s.compare("number:") == 0) {
getline(cin,s);
particles = stoi(s);
px = new float[particles];
py = new float[particles];
pz = new float[particles];
}
else if (s.compare("pitch:") == 0) {
getline(cin,s);
d = size*stof(s);
}
else if (s.compare("particles:") == 0) {
for (int i = 0; i < particles; ++i) {
cin.read((char *)&px[i],4);
cin.read((char *)&py[i],4);
cin.read((char *)&pz[i],4);
}
}
else if (s.compare("end:") == 0)
break;
}
cerr << "particles_STL:" << endl;
cerr << " input " << particles << " particles" << endl;
//
// write STL
//
float x0,y0,z0,x1,y1,z1,x2,y2,z2;
triangles = 8*particles;
cout.write(buf,80); // header
cout.write((char *)&triangles,4); // number
for (int i = 0; i < particles; ++i) { // particles
output(px[i]-d/2,px[i]+d/2,px[i],
py[i]-d/2,py[i]-d/2,py[i],
pz[i],pz[i],pz[i]+d/2);
output(px[i]+d/2,px[i]+d/2,px[i],
py[i]-d/2,py[i]+d/2,py[i],
pz[i],pz[i],pz[i]+d/2);
output(px[i]+d/2,px[i]-d/2,px[i],
py[i]+d/2,py[i]+d/2,py[i],
pz[i],pz[i],pz[i]+d/2);
output(px[i]-d/2,px[i]-d/2,px[i],
py[i]+d/2,py[i]-d/2,py[i],
pz[i],pz[i],pz[i]+d/2);
output(px[i]+d/2,px[i]-d/2,px[i],
py[i]-d/2,py[i]-d/2,py[i],
pz[i],pz[i],pz[i]-d/2);
output(px[i]+d/2,px[i]+d/2,px[i],
py[i]+d/2,py[i]-d/2,py[i],
pz[i],pz[i],pz[i]-d/2);
output(px[i]-d/2,px[i]+d/2,px[i],
py[i]+d/2,py[i]+d/2,py[i],
pz[i],pz[i],pz[i]-d/2);
output(px[i]-d/2,px[i]-d/2,px[i],
py[i]-d/2,py[i]+d/2,py[i],
pz[i],pz[i],pz[i]-d/2);
}
}