Пример #1
0
Slicer::Slicer(OptimizedVolume* ov, int32_t initial, int32_t thickness, bool keepNoneClosed, bool extensiveStitching)
{
    modelSize = ov->model->modelSize;
    modelMin = ov->model->vMin;
    
    int layerCount = (modelSize.z - initial) / thickness + 1;
    fprintf(stdout, "Layer count: %i\n", layerCount);
    layers.resize(layerCount);
    
    for(unsigned int i=0; i<ov->faces.size(); i++)
    {
        Point3 p0 = ov->points[ov->faces[i].index[0]].p;
        Point3 p1 = ov->points[ov->faces[i].index[1]].p;
        Point3 p2 = ov->points[ov->faces[i].index[2]].p;
        int32_t minZ = p0.z;
        int32_t maxZ = p0.z;
        if (p1.z < minZ) minZ = p1.z;
        if (p2.z < minZ) minZ = p2.z;
        if (p1.z > maxZ) maxZ = p1.z;
        if (p2.z > maxZ) maxZ = p2.z;
        
        for(int32_t layerNr = (minZ - initial) / thickness; layerNr <= (maxZ - initial) / thickness; layerNr++)
        {
            int32_t z = layerNr * thickness + initial;
            if (z < minZ) continue;
            if (layerNr < 0) continue;
            
            SlicerSegment s;
            if (p0.z < z && p1.z >= z && p2.z >= z)
                s = project2D(p0, p2, p1, z);
            else if (p0.z > z && p1.z < z && p2.z < z)
                s = project2D(p0, p1, p2, z);

            else if (p1.z < z && p0.z >= z && p2.z >= z)
                s = project2D(p1, p0, p2, z);
            else if (p1.z > z && p0.z < z && p2.z < z)
                s = project2D(p1, p2, p0, z);

            else if (p2.z < z && p1.z >= z && p0.z >= z)
                s = project2D(p2, p1, p0, z);
            else if (p2.z > z && p1.z < z && p0.z < z)
                s = project2D(p2, p0, p1, z);
            else
            {
                //Not all cases create a segment, because a point of a face could create just a dot, and two touching faces
                //  on the slice would create two segments
                continue;
            }
            layers[layerNr].faceToSegmentIndex[i] = layers[layerNr].segmentList.size();
            s.faceIndex = i;
            s.addedToPolygon = false;
            layers[layerNr].segmentList.push_back(s);
        }
    }
    
    for(unsigned int layerNr=0; layerNr<layers.size(); layerNr++)
    {
        layers[layerNr].makePolygons(ov, keepNoneClosed, extensiveStitching);
    }
}
Пример #2
0
Slicer::Slicer(Mesh* mesh, int initial, int thickness, int layer_count, bool keep_none_closed, bool extensive_stitching)
{
    assert(layer_count > 0);

    layers.resize(layer_count);
    
    for(int32_t layer_nr = 0; layer_nr < layer_count; layer_nr++)
    {
        layers[layer_nr].z = initial + thickness * layer_nr;
    }
    
    for(unsigned int mesh_idx = 0; mesh_idx < mesh->faces.size(); mesh_idx++)
    {
        MeshFace& face = mesh->faces[mesh_idx];
        Point3 p0 = mesh->vertices[face.vertex_index[0]].p;
        Point3 p1 = mesh->vertices[face.vertex_index[1]].p;
        Point3 p2 = mesh->vertices[face.vertex_index[2]].p;
        int32_t minZ = p0.z;
        int32_t maxZ = p0.z;
        if (p1.z < minZ) minZ = p1.z;
        if (p2.z < minZ) minZ = p2.z;
        if (p1.z > maxZ) maxZ = p1.z;
        if (p2.z > maxZ) maxZ = p2.z;
        int32_t layer_max = (maxZ - initial) / thickness;
        for(int32_t layer_nr = (minZ - initial) / thickness; layer_nr <= layer_max; layer_nr++)
        {
            int32_t z = layer_nr * thickness + initial;
            if (z < minZ) continue;
            if (layer_nr < 0) continue;
            
            SlicerSegment s;
            if (p0.z < z && p1.z >= z && p2.z >= z)
                s = project2D(p0, p2, p1, z);
            else if (p0.z > z && p1.z < z && p2.z < z)
                s = project2D(p0, p1, p2, z);

            else if (p1.z < z && p0.z >= z && p2.z >= z)
                s = project2D(p1, p0, p2, z);
            else if (p1.z > z && p0.z < z && p2.z < z)
                s = project2D(p1, p2, p0, z);

            else if (p2.z < z && p1.z >= z && p0.z >= z)
                s = project2D(p2, p1, p0, z);
            else if (p2.z > z && p1.z < z && p0.z < z)
                s = project2D(p2, p0, p1, z);
            else
            {
                //Not all cases create a segment, because a point of a face could create just a dot, and two touching faces
                //  on the slice would create two segments
                continue;
            }
            layers[layer_nr].face_idx_to_segment_index.insert(std::make_pair(mesh_idx, layers[layer_nr].segmentList.size()));
            s.faceIndex = mesh_idx;
            s.addedToPolygon = false;
            layers[layer_nr].segmentList.push_back(s);
        }
    }
    for(unsigned int layer_nr=0; layer_nr<layers.size(); layer_nr++)
    {
        layers[layer_nr].makePolygons(mesh, keep_none_closed, extensive_stitching);
    }
}
Пример #3
0
int main(int argc, char** argv) {

    std::cout << "**************************************************\n"
            << "*** Introduction to Visual Computing, SS 2015  ***\n"
            << "*** Exercise 03: OpenCV Stub                   ***\n"
            << "**************************************************\n"
            << "*** Author: Dipl.-Inf. Sven Sickert            ***\n"
            << "**************************************************\n\n";

    // create a new window
    cv::namedWindow("My Image Window", CV_WINDOW_AUTOSIZE || CV_WINDOW_KEEPRATIO);
    //cv::Mat img(480, 640, CV_8UC3);
    cv::Mat * img = genMatrix();

    Object3DListType objects3D;
    create3DObject(objects3D);

    //Lade Ausgangs-Parameter
    std::vector<double> position;
    position.push_back(posZ);
    position.push_back(posY);
    position.push_back(posX);
    std::vector<double> direction;
    direction.push_back(vZ);
    direction.push_back(vY);
    direction.push_back(vX);
    double focalDistance = FOCAL_DISTANCE;
    char key;
    bool quit;


    //Verschiebe Objekte in einen sichtbaren Bereich
    for (Object3DListType::iterator objIt = objects3D.begin(); objIt != objects3D.end(); objIt++) {
        for (Point3DListType::iterator pointIt = (*objIt).first.begin(); pointIt != (*objIt).first.end(); pointIt++) {
            (*pointIt)[0] += 30;
            (*pointIt)[1] += 30;
            (*pointIt)[2] += 30;
        }
    }

    do {
        key = (char) cv::waitKey();
        delete img;
        //std::cout << key << " " << std::endl;
        std::cout << "--------Position--------" << std::endl;
        std::cout << "posX = " << position[0] << std::endl;
        std::cout << "posY = " << position[1] << std::endl;
        std::cout << "posZ = " << position[2] << std::endl;
        std::cout << "vX = " << direction[0] << std::endl;
        std::cout << "vY = " << direction[1] << std::endl;
        std::cout << "vZ = " << direction[2] << std::endl;

        switch (key) {
            case 'q':
                quit = true;
                break;

                //--------Position    
            case 'w':
                position[1]++;
                break;
            case 's':
                position[1]--;
                break;
            case 'a':
                position[0]--;
                break;
            case 'd':
                position[0]++;
                break;
            case 'x':
                position[2]++;
                break;
            case 'y':
                position[2]--;
                break;
                //--------Blickvector
            case 'R':
                direction[0]++;
                break;
            case 'Q':
                direction[1]--;
                break;
            case 'T':
                direction[0]--;
                break;
            case 'S':
                direction[1]++;
                break;
            case ',':
                direction[2]--;
                break;
            case '.':
                direction[2]++;
                break;


        }
        img = genMatrix();
        Object2DListType objects2D = project2D(objects3D, position, direction, focalDistance);
        draw2DObjects(*img, objects2D);
        cv::imshow("My Image Window", *img);

    } while (!quit);






    return 0;
}