⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchengine.java

📁 基于java的3d开发库。对坐java3d的朋友有很大的帮助。
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        System.out.println("Searching for closest 3D model to " + filename);        ArrayList <Result> results = new ArrayList <Result>();        GeometryMetadata m = analyzeModel(null, filename, false, false, distanceFieldSide, null, null, null);        if ( m == null ) {            System.err.println("Error analyzing reference model. No results reported.");            return results;        }        shapeDatabase.searchMatches(results, m.getDescriptorByName("SPHERICAL_HARMONIC_3D"), ResultSource.SPHERICAL_HARMONIC, -1, tolerance);        //-----------------------------------------------------------------        timers.get("SEARCH_MODEL").stop();        return results;    }    /**    This method implements the matching step as described in [FUNK2003].3.2.    @todo: at a negative tolerance, this method should not use "tolerance" but    return the -tolerance closest models. For example, for an equal behavior    to the search engine described in [FUNK2003], this value should be -16.0.    */    public ArrayList <Result> matchModelSphericalHarmonics(        GeometryMetadata m, ShapeDatabase shapeDatabase, double tolerance)    {        timers.get("SEARCH_MODEL").start();        //-----------------------------------------------------------------        System.out.println("Searching for closest 3D model to given model with id " + m.getId());        ArrayList <Result> results = new ArrayList <Result>();        if ( m == null ) {            System.err.println("Error analyzing reference model. No results reported.");            return results;        }        shapeDatabase.searchMatches(results, m.getDescriptorByName("SPHERICAL_HARMONIC_3D"), ResultSource.SPHERICAL_HARMONIC, -1, tolerance);        //-----------------------------------------------------------------        timers.get("SEARCH_MODEL").stop();        return results;    }    public ArrayList <Result> matchSketch(        IndexedColorImage distanceField,        ShapeDatabase shapeDatabase,        double tolerance, int sketchId)    {        timers.get("SEARCH_MODEL").start();        //-----------------------------------------------------------------        ArrayList <Result> results;        int i;        results = new ArrayList <Result>();        ShapeDescriptor2DGenerator component = new ShapeDescriptor2DGenerator();        FourierShapeDescriptor fourierShapeDescriptor;        fourierShapeDescriptor = component.calculateCircularHarmonicsShapeDescriptor(distanceField, "PROJECTED_VIEW_CUBE_0");        if ( fourierShapeDescriptor == null ) {            return results;        }        String name;        for ( i = 1; i <= 13; i++ ) {            name = "PROJECTED_VIEW_CUBE_" + i;            fourierShapeDescriptor.setLabel(name);            shapeDatabase.searchMatches(results, fourierShapeDescriptor, ResultSource.CUBE13VIEW+i, sketchId, tolerance);        }        //-----------------------------------------------------------------        timers.get("SEARCH_MODEL").stop();        return results;    }    public ArrayList <Result> matchSketchRestricted(        IndexedColorImage distanceField,        double tolerance, ArrayList <Result> prevSearch,        int sketchId)    {        timers.get("SEARCH_MODEL").start();        //-----------------------------------------------------------------        int i, j;        double Ls;        ArrayList <Result> results = new ArrayList <Result>();        Result result;        ShapeDescriptor2DGenerator component = new ShapeDescriptor2DGenerator();        FourierShapeDescriptor fourierShapeDescriptor;        fourierShapeDescriptor = component.calculateCircularHarmonicsShapeDescriptor(distanceField, "PROJECTED_VIEW_CUBE_0");        if ( fourierShapeDescriptor == null ) {            return results;        }        GeometryMetadata metadata = new GeometryMetadata();        GeometryMetadata n;        GeometryMetadata descriptor;        metadata.getDescriptors().add(fourierShapeDescriptor);        String name;        for ( i = 0; i < prevSearch.size(); i++ ) {            // Takes into consideration the euclidean distance as indicated            // in [FUNK2003].4 (L2 Minskowski distance).            descriptor = prevSearch.get(i).getDescriptor();            for ( j = 1; descriptor != null && j <= 13; j++ ) {                name = "PROJECTED_VIEW_CUBE_" + j;                fourierShapeDescriptor.setLabel(name);                Ls = metadata.doMinskowskiDistance(descriptor, 2, name);                if ( Ls < tolerance ) {                    n = descriptor;                    result = Result.searchResult(results, n.getId());                    if ( result == null ) {                        result = new Result(n.getFilename(), n.getId(),                            new ResultSource(ResultSource.CUBE13VIEW+j, Ls, sketchId));                        results.add(result);                    }                    else {                        result.addSource(                            new ResultSource(ResultSource.CUBE13VIEW+j, Ls, sketchId));                    }                }            }        }        Result prevResult;        for ( i = 0; i < results.size(); i++ ) {            result = results.get(i);            prevResult = Result.searchResult(prevSearch, result.getId());            if ( prevResult != null ) {                ArrayList<ResultSource> parts;                ResultSource part;                int oldSource;                int oldSketchId;                double oldDistance;                parts = prevResult.getParts();                for ( j = 0; j < parts.size(); j++ ) {                    part = parts.get(j);                    oldSource = part.getSource();                    oldSketchId = part.getSketchId();                    oldDistance = part.getDistance();                    result.addSource(                        new ResultSource(oldSource, oldDistance, oldSketchId));                }            }        }        //-----------------------------------------------------------------        timers.get("SEARCH_MODEL").stop();        return results;    }    public void    readDatabase(ShapeDatabase database)    {        timers.get("READ_DATABASE").start();        database.connect();        timers.get("READ_DATABASE").stop();    }    public void    syncDatabase(ShapeDatabase shapeDatabase)    {        System.out.print("Writing database ... ");        timers.get("WRITE_DATABASE").start();        shapeDatabase.sync();        timers.get("WRITE_DATABASE").stop();        System.out.println(shapeDatabase.getNumEntries() + " entries, Ok. ");    }    /**    This method implements the indexing step as described in [FUNK2003].3.2.    */    public void indexFiles(GL gl, String filenamesList[],                           ShapeDatabase shapeDatabase,                           int distanceFieldSide, GLCanvas canvas,                           JoglShapeMatchingOfflineRenderer offlineRenderer,                           JoglProjectedViewRenderer projectedViewRenderer)    {        int i, j;        GeometryMetadata m, other;        if ( gl == null || offlineRenderer == null ||             projectedViewRenderer == null ) {            VSDK.reportMessage(this, VSDK.WARNING,                               "indexFiles",            "Graphical contexts needed for indexing models not available.\n" +            "Aborting file indexing.");            return;        }        for ( i = 1; i < filenamesList.length; i++ ) {            // If that model was before in database, delete it            other = shapeDatabase.searchEntryByFilename(filenamesList[i]);            if ( other != null ) {                shapeDatabase.removeEntryById(other.getId());            }            // Insert new model in database            m = analyzeModel(gl, filenamesList[i], true, true, distanceFieldSide, canvas, offlineRenderer, projectedViewRenderer);            shapeDatabase.addEntry(m);            System.gc();        }    }    public IndexedColorImage    readIndexedColorImage(String imageFilename, int distanceFieldSide)    {        System.out.println("Searching for sketches from image (distance field) " + imageFilename);        RGBImage img = null;        IndexedColorImage distanceField = new IndexedColorImage();        try {            img = ImagePersistence.importRGB(new File(imageFilename));        }        catch (Exception e) {            System.err.println("Error: could not read the image file \"" + imageFilename + "\".");            System.err.println("Check you have access to that file from current working directory.");            System.err.println(e);            return null;        }        if ( img.getXSize() != distanceFieldSide ||             img.getYSize() != distanceFieldSide ) {            return null;        }        distanceField.init(distanceFieldSide, distanceFieldSide);        int x, y, val;        RGBPixel p;        for ( x = 0; x < img.getXSize(); x++ ) {            for ( y = 0; y < img.getYSize(); y++ ) {                p = img.getPixel(x, y);                val = ((VSDK.signedByte2unsignedInteger(p.r)) +                       (VSDK.signedByte2unsignedInteger(p.g)) +                       (VSDK.signedByte2unsignedInteger(p.b))) / 3;                distanceField.putPixel(x, y,                    VSDK.unsigned8BitInteger2signedByte(val));            }        }        return distanceField;    }    private void writePreviousNextAsHtml(PrintWriter out, ArrayList <Result> similarModels, long sessionId, int start, int size)    {        int a, b;        if ( start - size > -1 ) {            a = start - size;            if ( a < 0 ) a = 0;            b = start -1;            out.write("<A HREF=\"ServletConsole?session=" + sessionId + "&input=show_cached_results&start=" + a + "\">Previous page (" + (a+1) + " - " + (b+1) + ")</A>");            if ( start + size < similarModels.size() ) {                out.write(" | ");            }            else {                out.write("&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;");            }        }        if ( start + size < similarModels.size() ) {            a = start + size;            b = start + 2*size;            if ( similarModels.size() < b ) {                b = similarModels.size();            }            out.write("<A HREF=\"ServletConsole?session=" + sessionId + "&input=show_cached_results&start=" + a + "\">Next page (" + (a+1) + " - " + b + ")</A>");            out.write("&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;");        }    }    public void writeResultsAsHtml(PrintWriter out, ArrayList <Result> similarModels, ShapeDatabase shapeDatabase, String dir, long sessionId, int start, int size)    {        //- Header --------------------------------------------------------        out.write("<HTML>\n");        out.write("<H1>VITRAL BASED 3D MODEL SEARCH ENGINE</H1>\n");        out.write("<B>Search results in database [test]</B>, " + shapeDatabase.getNumEntries() + " models &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <FONT SIZE=\"-1\">(click on a thumbnail for more information on that model)</FONT><P>\n");        out.write("<FONT SIZE=\"-1\">");        //-----------------------------------------------------------------        if ( similarModels.size() <= 0 ) {            out.write("<FONT SIZE=\"+3\"><CENTER>No results founded for current search.</CENTER></FONT>");        }        //- Next / previous links -----------------------------------------        if ( similarModels.size() > 0 ) {            writePreviousNextAsHtml(out, similarModels, sessionId, start, size);            out.write("results: " + similarModels.size() + "</FONT>\n");        }        //- Results table -------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -