16 const std::vector<PointXYZ>& points,
20 return WriteFormatPLY(filename, points, std::vector<uint32_t>(), std::vector<uint16_t>(), useBinary, presentation);
24 const std::vector<PointXYZ>& points,
25 const std::vector<uint32_t>& rgbaMap,
29 return WriteFormatPLY(filename, points, rgbaMap, std::vector<uint16_t>(), useBinary, presentation);
33 const std::vector<PointXYZ>& points,
34 const std::vector<uint16_t>& intensityMap,
38 return WriteFormatPLY(filename, points, std::vector<uint32_t>(), intensityMap, useBinary, presentation);
42 const std::vector<PointXYZ>& points,
43 const std::vector<uint32_t>& rgbaMap,
44 const std::vector<uint16_t>& intensityMap,
50 bool hasColors = points.size() == rgbaMap.size();
51 bool hasIntensities = points.size() == intensityMap.size();
61 int numberOfValidPoints = 0;
62 if (useBinary ==
false)
65 for (
size_t i = 0;
i < points.size();
i++)
72 strstream << point.
x <<
" " << point.
y <<
" " << point.
z;
76 if (std::isnan(point.
x))
82 if (std::isnan(point.
y))
88 if (std::isnan(point.
z))
97 const auto rgba =
reinterpret_cast<const uint8_t*
>(&rgbaMap.at(
i));
98 strstream <<
" " <<
static_cast<uint32_t
>(rgba[0]) <<
" " <<
static_cast<uint32_t
>(rgba[1]) <<
" "
99 <<
static_cast<uint32_t
>(rgba[2]);
103 float intensity =
static_cast<float>(intensityMap.at(
i)) / 65535.0
f;
104 strstream <<
" " << intensity;
112 if (std::isnan(point.
z))
118 strstream << point.
x <<
" " << point.
y <<
" " << point.
z;
122 const auto rgba =
reinterpret_cast<const uint8_t*
>(&rgbaMap.at(
i));
123 strstream <<
" " <<
static_cast<uint32_t
>(rgba[0]) <<
" " <<
static_cast<uint32_t
>(rgba[1]) <<
" "
124 <<
static_cast<uint32_t
>(rgba[2]);
128 float intensity =
static_cast<float>(intensityMap.at(
i)) / 65535.0
f;
129 strstream <<
" " << intensity;
133 numberOfValidPoints++;
141 for (
size_t i = 0;
i < points.size();
i++)
152 if (std::isnan(point.
x))
154 if (std::isnan(point.
y))
156 if (std::isnan(point.
z))
165 strstream.write(
reinterpret_cast<char*
>(&x), 4);
166 strstream.write(
reinterpret_cast<char*
>(&y), 4);
167 strstream.write(
reinterpret_cast<char*
>(&z), 4);
171 strstream.write(
reinterpret_cast<const char*
>(&rgbaMap.at(
i)), 3);
175 float intensity =
static_cast<float>(intensityMap.at(
i)) / 65535.0
f;
176 strstream.write(
reinterpret_cast<const char*
>(&intensity), 4);
183 if (std::isnan(point.
z))
193 strstream.write(
reinterpret_cast<char*
>(&x), 4);
194 strstream.write(
reinterpret_cast<char*
>(&y), 4);
195 strstream.write(
reinterpret_cast<char*
>(&z), 4);
199 strstream.write(
reinterpret_cast<const char*
>(&rgbaMap.at(
i)), 3);
203 float intensity =
static_cast<float>(intensityMap.at(
i)) / 65535.0
f;
204 strstream.write(
reinterpret_cast<const char*
>(&intensity), 4);
207 numberOfValidPoints++;
214 stream.open(filename, useBinary ? (std::ios_base::out | std::ios_base::binary) : std::ios_base::out);
216 if (stream.is_open())
220 stream <<
"format " << (useBinary ?
"binary_little_endian" :
"ascii") <<
" 1.0\n";
224 stream <<
"element vertex " << numberOfValidPoints <<
"\n";
228 stream <<
"element vertex " << points.size() <<
"\n";
231 stream <<
"property float x\n";
232 stream <<
"property float y\n";
233 stream <<
"property float z\n";
236 stream <<
"property uchar red\n";
237 stream <<
"property uchar green\n";
238 stream <<
"property uchar blue\n";
242 stream <<
"property float intensity\n";
244 stream <<
"end_header\n";
252 stream << strstream.rdbuf();