void WritePly(const std::vector<CVector<3,double> >& result, const Field<2,float>& mask, std::string filename) { // generate face indices Field<2,int> index(mask.size()); for (int y=0, idx=0; y<mask.size(1); y++) for (int x=0; x<mask.size(0); x++) if (mask.cell(x,y)) index.cell(x,y)=idx++; else index.cell(x,y)=-1; std::vector<CVector<3,int> > face; for (int y=0; y<mask.size(1)-1; y++) { for (int x=0; x<mask.size(0)-1; x++) { // sore in CCW order if (mask.cell(x,y) && mask.cell(x+1,y) && mask.cell(x+1,y+1) && !distorted(index.cell(x,y),index.cell(x+1,y),index.cell(x+1,y+1),result)) face.push_back(make_vector(index.cell(x,y),index.cell(x+1,y+1),index.cell(x+1,y))); if (mask.cell(x,y) && mask.cell(x+1,y+1) && mask.cell(x,y+1) && !distorted(index.cell(x,y),index.cell(x+1,y+1),index.cell(x,y+1),result)) face.push_back(make_vector(index.cell(x,y),index.cell(x,y+1),index.cell(x+1,y+1))); } } TRACE("ply => %s\n",filename.c_str()); FILE *fw = fopen(filename.c_str(), "wb"); fprintf(fw, "ply\n" "format binary_little_endian 1.0\n" "element vertex %d\n" "property float x\n" "property float y\n" "property float z\n" "element face %d\n" "property list uchar int vertex_indices\n" "end_header\n", result.size(), face.size()); for (int i=0; i<result.size(); i++) { CVector<3,float> p = make_vector(result[i][0],result[i][1],result[i][2]); fwrite(&p, 12, 1, fw); } for (int i=0; i<face.size(); i++) { fputc(3,fw); fwrite(&face[i], 12, 1, fw); } fclose(fw); }
int poor_distorted_font_rep::index_glyph (string s, font_metric& fnm, font_glyphs& fng) { int c= base->index_glyph (s, fnm, fng); if (c < 0) return c; //fnm= distorted (fnm, kind); fng= distorted (fng, kind, wfn); return c; }