bool Mesh::complexify() { if (selection != SELECTION_FACE) return false; float xyz[3] = {0}; for (int v : face_selected.face->getVerts()) for (int i = 0; i < 3; i++) xyz[i] += verts[v].getCoords()[i] / face_selected.face->getVerts().size(); Vertex centroid = Vertex(xyz); centroid.set_deletable(true); addVerts(centroid); for (unsigned int i = 0; i < face_selected.face->getVerts().size(); i++) { Face* f = new Face(); f->addVert(face_selected.face->getVerts()[i]); f->addVert(face_selected.face->getVerts()[(i + 1) % (face_selected.face->getVerts().size())]); f->addVert(verts.size() - 1); groups[face_selected.group_pos]->addFace(f); } groups[face_selected.group_pos]->eraseFaceAt(face_selected.face_pos); clear_selection(); return true; }
void Mesh::render_new_face(float* xyz) { Vertex new_vertex = Vertex(xyz); new_vertex.set_deletable(true); unsigned int vertex_pos_first = 0; unsigned int vertex_pos_second; float min_dist = distance_bet(new_vertex, verts[vertex_pos_first]); for (unsigned int i = 1; i < verts.size(); i++) { float dist = distance_bet(new_vertex, verts[i]); if (dist < min_dist) { min_dist = dist; vertex_pos_first = i; } } do vertex_pos_second = rand_lim(verts.size()); while (vertex_pos_second == vertex_pos_first); min_dist = distance_bet(new_vertex, verts[vertex_pos_second]); for (unsigned int i = 0; i < verts.size(); i++) { float dist = distance_bet(new_vertex, verts[i]); if (dist < min_dist && i != vertex_pos_first) { min_dist = dist; vertex_pos_second = i; } } addVerts(new_vertex); Face* new_face = new Face(); new_face->addVert(verts.size() - 1); new_face->addVert(vertex_pos_first); new_face->addVert(vertex_pos_second); groups[groups.size() - 1]->addFace(new_face); }
void PlotWithDomain::makePoints(std::vector<domain *> domains) { dataNum = getBaseNum(); double *x = new double[dataNum]; double *y = new double[dataNum]; for(std::vector<domain *>::iterator dt=domains.begin();dt!=domains.end();dt++) { double xmin=(*dt)->min; double xmax=(*dt)->max; //dataNum = getBaseNum() * ((xmax - xmin) / ((*(domains.end() - 1))->max - (*domains.begin())->min)); for (int i = 0; i < dataNum; i++) { x[i] = xmin + (xmax - xmin) * i / (dataNum - 1); } f->getArrayData(x, y, dataNum); LineStrip* lineStrip; //add the first in-range point int i = 0; while (((y[i] < ymin) || (y[i] > ymax) || isNaN(y[i])) && i < dataNum) i++; if (i == dataNum) { return; } lineStrip = new LineStrip; lineStrips.add(lineStrip); if (i == 0) { lineStrip->vert.add(new Point2d(x[i], y[i])); } else { //xmin point was excluded double newx = getPointOnRangeFromLeft(x[i-1], x[i], 1); double newy = f->getSingleData(newx); lineStrip->vert.add(new Point2d(newx, newy)); lineStrip->vert.add(new Point2d(x[i], y[i])); } i++; int state = 0; while (i < dataNum) { if ((y[i] > ymin) && (y[i] < ymax) && !isNaN(y[i])) { if (state == 0) { //line strip still going lineStrip->vert.add(new Point2d(x[i], y[i])); } else { //make a new line strip lineStrip = new LineStrip; lineStrips.add(lineStrip); double newx = getPointOnRangeFromLeft(x[i-1], x[i], 1); double newy = f->getSingleData(newx); lineStrip->vert.add(new Point2d(newx, newy)); lineStrip->vert.add(new Point2d(x[i], y[i])); state = 0; } } else { if (state == 0) { //a line strip ends double newx = getPointOnRangeFromRight(x[i-1], x[i], 1); double newy = f->getSingleData(newx); lineStrip->vert.add(new Point2d(newx, newy)); state = 1; } else { //do nothing } } i++; } spx = xmax - xmin; spy = ymax - ymin; graphScale = spy / spx; dx = spx / LARGE; for (unsigned int i = 0; i < lineStrips.size(); i++) addVerts(lineStrips[i]); } delete []x; delete []y; }