+
+ points.push_back(p);
+ data.push_back(d);
+ }
+}
+
+void write_points_txt(const std::string& fileName, const PointArrayType& points, const TxtDataArrayType& data)
+{
+ std::ofstream landmarksFile(fileName.c_str());
+
+ landmarksFile << "LANDMARKS1" << std::endl;
+ for (size_t i = 0; i < points.size(); i++)
+ landmarksFile << data[i][0] << " " << points[i][0] << " " << points[i][1] << " " << points[i][2] << " " << data[i][1] << " " << std::endl;
+}
+
+void read_points_pts(const std::string& fileName, PointArrayType& points)
+{
+ std::ifstream landmarksFile(fileName.c_str());
+ if (landmarksFile.fail()) {
+ std::cerr << "ERROR: could not open '" << fileName << "'" << std::endl;
+ exit(-2);
+ }
+
+ std::string line;
+ std::getline(landmarksFile, line);
+ if (line.find("#X") != 0) {
+ std::cerr << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
+ exit(-3);
+ }
+
+ PointType p;
+ p.Fill(1);
+
+ while (!landmarksFile.eof()) {
+ // read id, x, y, z, d1, d2
+ landmarksFile >> p[0] >> p[1] >> p[2];
+ if (landmarksFile.fail())
+ break;
+
+ if (verbose){
+ std::cout << "point " << p << std::endl;
+ }
+
+ points.push_back(p);
+ }
+}
+
+void write_points_pts(const std::string& fileName, const PointArrayType& points)
+{
+ std::ofstream landmarksFile(fileName.c_str());
+
+ landmarksFile << "#X\tY\tZ" << std::endl;
+ for (size_t i = 0; i < points.size(); i++)
+ landmarksFile << points[i][0] << "\t" << points[i][1] << "\t" << points[i][2] << "\t" << std::endl;
+}
+
+void apply_spacing(const PointArrayType& input, const double* spacing, PointArrayType& output)
+{
+ PointType out;
+ out.Fill(1);
+
+ for (size_t i = 0; i < input.size(); i++) {
+ out[0] = input[i][0] * spacing[0];
+ out[1] = input[i][1] * spacing[1];
+ out[2] = input[i][2] * spacing[2];
+ if (verbose){
+ std::cout << "output " << out << std::endl;
+ }
+ output.push_back(out);