20191110 Created 201402: Sorry, I remember, made mistakes of cutting edges and placed the colde here. We could open the part of source code as emergency: one of development records: public class WireFrame : --- public LineMesh[] hideLines(Camera cam, Mesh mesh) { LineMesh[] l = print_lines(cam, mesh); return l; } private LineMesh[] print_lines(Camera cam, Mesh mesh) { LineMesh[] all_lines = onScreenLineMesh( cam, mesh); for(int i=0; i<all_lines.length; i++) { for(int j=0; j<mesh.faces.length; j++) { if ( all_lines[i].onFace != j ) { all_lines = hide_lines(cam, all_lines, i, mesh, j); if( i >= all_lines.length ) { break; } } } } all_lines = inWorld( cam, all_lines, mesh); return all_lines; } --- private Mesh create_visible_mesh(ZbufID[][] buf, Mesh mesh) { HashMap<Integer, Integer> has = new HashMap<Integer, Integer>(); int count = 0; for(int j=0; j<buf.length; j++) { for(int i=0; i<buf[j].length; i++) { if (buf[j][i].id == -1) continue; if (!has.containsValue(new Integer(buf[j][i].id)) ) { has.put(new Integer(count), new Integer(buf[j][i].id)); count ++; } } } System.out.println("reduce face number " + mesh.faces.length + " to " + count); int faces[][] = new int[has.size()][]; for(int j=0; j<count; j++) { faces[j] = new int[3]; } for (int i = 0; i<count; i++) { faces[i] = mesh.faces[has.get(new Integer(i)).intValue()]; } //points int count_p = 0; HashMap<Integer, Integer> indexto = new HashMap<Integer, Integer>(); HashMap<Integer, Point> has_p = new HashMap<Integer, Point>(); for (int i = 0; i<count; i++) { faces[i] = mesh.faces[has.get(new Integer(i)).intValue()]; for (int j = 0; j<3; j++) { Point p = mesh.points[faces[i][j]]; if(!has_p.containsValue(p)) { has_p.put(new Integer(count_p), p); indexto.put(new Integer(faces[i][j]), new Integer(count_p)); count_p ++; } } } Point[] ps = new Point[count_p]; for (int i = 0; i<count_p; i++) { ps[i] = has_p.get(new Integer(i)); } //revice face number for (int i = 0; i<count; i++) { faces[i] = mesh.faces[has.get(new Integer(i)).intValue()]; for (int j = 0; j<3; j++) { int from = faces[i][j]; faces[i][j] = indexto.get(new Integer(from)).intValue(); } } Mesh v_mesh = new Mesh(); v_mesh.faces = faces; v_mesh.points = ps; v_mesh.generate_faces_normal_counterclockwise(); return v_mesh; } --- public LineMesh[] hide_line(Camera cam, Mesh mesh) { WireFrame wire = new WireFrame(); buf = new ZbufID[cam.screen.disolution_x][cam.screen.disolution_y]; for(int j=0; j<cam.screen.disolution_y; j++) { for(int i=0; i<cam.screen.disolution_x; i++) { buf[i][j] = new ZbufID(); buf[i][j].z = Double.MAX_VALUE; buf[i][j].id = -1; } } for(int i=0; i<mesh.faces.length; i++) { buf = render_face_id(cam, i, mesh, buf); System.out.println("face num = " + i + "/" +( mesh.faces.length - 1)); } Mesh v_mesh = create_visible_mesh(buf, mesh); LineMesh[] l = wire.hideLines(cam, v_mesh); return l; } ---