📄 searchengine.java
字号:
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(" "); } } 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(" "); } } 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 <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 + -