Commit a9e66469 authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Merge branch '35-extend-meshmodel-with-kd-trees-kdTreeClass' into 'master'

Resolve "Extend `MeshModel` with kd-trees"

Closes #35

See merge request grp-fidentis/analyst2!45
parents 1b210161 7bd56955
Loading
Loading
Loading
Loading

FIDENTIS-Analyst-parent.iml

deleted100644 → 0
+0 −12
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
 No newline at end of file

GUI/GUI.iml

deleted100644 → 0
+0 −23
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" name="Maven: org.netbeans.api:org-netbeans-api-annotations-common:RELEASE82" level="project" />
    <orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:2.0-rc11" level="project" />
    <orderEntry type="module" module-name="MeshModel" />
    <orderEntry type="library" name="Maven: java3d:j3d-core-utils:1.3.1" level="project" />
    <orderEntry type="library" name="Maven: java3d:vecmath:1.3.1" level="project" />
    <orderEntry type="library" name="Maven: java3d:j3d-core:1.3.1" level="project" />
    <orderEntry type="library" name="Maven: com.github.mokiat:java-data-front:v2.0.0" level="project" />
    <orderEntry type="library" name="Maven: javax.vecmath:vecmath:1.5.2" level="project" />
  </component>
</module>

MeshModel/MeshModel.iml

deleted100644 → 0
+0 −49
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/../application/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <content url="file://$MODULE_DIR$/../application/src/test/java" />
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.6.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.testng:testng:7.1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: com.beust:jcommander:1.72" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: com.google.inject:guice:no_aop:4.1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: javax.inject:javax.inject:1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: aopalliance:aopalliance:1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: com.google.guava:guava:19.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.yaml:snakeyaml:1.21" level="project" />
    <orderEntry type="library" name="Maven: java3d:j3d-core-utils:1.3.1" level="project" />
    <orderEntry type="library" name="Maven: java3d:vecmath:1.3.1" level="project" />
    <orderEntry type="library" name="Maven: java3d:j3d-core:1.3.1" level="project" />
    <orderEntry type="library" name="Maven: org.netbeans.api:org-netbeans-api-annotations-common:RELEASE82" level="project" />
    <orderEntry type="library" name="Maven: com.github.mokiat:java-data-front:v2.0.0" level="project" />
    <orderEntry type="library" name="Maven: javax.vecmath:vecmath:1.5.2" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.6.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.6.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.6.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.testng:testng:7.1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: com.beust:jcommander:1.72" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: com.google.inject:guice:no_aop:4.1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: javax.inject:javax.inject:1" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: aopalliance:aopalliance:1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: com.google.guava:guava:19.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Maven: org.yaml:snakeyaml:1.21" level="project" />
  </component>
</module>
 No newline at end of file
+193 −0
Original line number Diff line number Diff line
package cz.fidentis.analyst.kdtree;

import cz.fidentis.analyst.mesh.core.MeshFacet;
import java.util.Collection;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.vecmath.Vector3d;

/**
 * A single node of a KD-tree. Sharing verticess across meshes is supported
 * (the node links all faces that share the same vertex).
 *
 * @author Maria Kocurekova
 */
public class KdNode {
    /**
     * Current depth in the kd-tree
     */
    private final int depth;
    
    /**
     * Mesh facets sharing the stored vertex
     */
    private Map<MeshFacet, Integer> facets = new HashMap<>();

    /**
     * KD-tree topology
     */
    private KdNode lesser = null;
    private KdNode greater = null;
    private KdNode parent;

    /**
     * Constructor of KdNode
     *
     * @param facet Mesh facet containing the mesh vertex. Must not be null
     * @param index The index under which the vertex is stored in the mesh facet.
     *              Must be &gt;= 0
     * @param depth Depth of the node in the kd-tree. Must be &gt;= 0
     * @param parent Parent node. Can be null
     * @throws IllegalArgumentException if some parameter is wrong
     */
    public KdNode(MeshFacet facet, int index, int depth, KdNode parent) {
        if (facet == null) {
            throw new IllegalArgumentException("facet");
        }
        if (index < 0) {
            throw new IllegalArgumentException("index");
        }
        if (depth < 0) {
            throw new IllegalArgumentException("depth");
        }
        this.facets.putIfAbsent(facet, index);
        this.depth = depth;
        this.parent = parent;
    }
    
    /**
     * Constructor of KdNode
     * 
     * @param facets Mesh facets containing the mesh vertex. Must not be null or empty
     * @param indices Indices under which the vertex is stored in the mesh facet.
     *              Must be &gt;= 0 and their unmber has to correspond to the number of facets.
     * @param depth Depth of the node in the kd-tree. Must be &gt;= 0
     * @param parent Parent node. Can be null
     * @throws IllegalArgumentException if some parameter is wrong
     */
    public KdNode(List<MeshFacet> facets, List<Integer> indices, int depth, KdNode parent) {
        if (facets == null || facets.isEmpty()) {
            throw new IllegalArgumentException("facets");
        }
        if (indices == null || indices.isEmpty()) {
            throw new IllegalArgumentException("indices");
        }
        if (depth < 0) {
            throw new IllegalArgumentException("depth");
        }
        if (facets.size() != indices.size()) {
            throw new IllegalArgumentException("The number of facets and indiecs mismatch");
        }
        for (int i = 0; i < facets.size(); i++) {
            this.facets.putIfAbsent(facets.get(i), indices.get(i));
        }
        this.depth = depth;
        this.parent = parent;
    }

    /**
     * Adds another mesh facet to the node. This facet has to share a vertex 
     * (location coordinates) with vertex/facets already stored in the node. 
     * Otherwise, the behaviour may be unexpected.
     *
     * @param facet Mesh facet which has a vertex with the same coordinates as already stored vertex
     * @param index The index under which the vertex is stored in the mesh facet
     */
    public void addFacet(MeshFacet facet, int index){
        this.facets.putIfAbsent(facet, index);
    }

    public int getDepth() {
        return depth;
    }

    public Vector3d get3dLocation() {
        Map.Entry<MeshFacet, Integer> entry = facets.entrySet().iterator().next();
        return entry.getKey().getVertex(entry.getValue()).getPosition();
    }

    /**
     * Tree traversal - go to the "lesser" child.
     * 
     * @return lesser node, null if current node is leaf
     */
    public KdNode getLesser() {
        return lesser;
    }

    /**
     * Tree traversal - go to the "grater" child.
     * 
     * @return greater node, null if current node is leaf
     */
    public KdNode getGreater() {
        return greater;
    }

    /**
     * Tree traversal - go to the parent node.
     * 
     * @return parent of this node, null if current node is root
     */
    public KdNode getParent() {
        return parent;
    }

    /**
     * Set lesser node.
     *
     * @param lesser Node to be set as lesser
     * @return current node
     */
    public KdNode setLesser(KdNode lesser) {
        this.lesser = lesser;
        return this;
    }

    /**
     * Set lesser node.
     *
     * @param greater Node to be set as greater
     * @return current node
     */
    public KdNode setGreater(KdNode greater) {
        this.greater = greater;
        return this;
    }

    /**
     * Returns a map of all mesh facets that share the stored vertex. 
     * Value in the map contains the index which the vertex is stored in the mesh facet.
     * 
     * @return Map of facets sharing the stored mesh vertex
     */
    public Map<MeshFacet, Integer> getFacets() {
        return Collections.unmodifiableMap(facets);
    }

    /**
     * Set parent node.
     *
     * @param parent Node to be set as parent
     * @return current node
     */
    public KdNode setParent(KdNode parent) {
        this.parent = parent;
        return this;
    }
    
    @Override
    public String toString() {
        String ret = "";
        for (int i = 0; i < depth; i++) {
            ret += " ";
        }
        ret += "Node position: " + get3dLocation() + ", num. facets:  " + facets.size();
        ret += System.lineSeparator();
        return ret;
    }

}
+406 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading