Esempio n. 1
0
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;
}
Esempio n. 2
0
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); 
}
Esempio n. 3
0
    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;


    }