Switch to Maven project.
69
.classpath
@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="src" output="target/classes" path="src/main">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="optional" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="src" output="target/test-classes" path="src/test">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="optional" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/kxml2-2.3.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-core-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-core-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-map-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-map-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-map-awt-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-map-awt-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-map-reader-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-map-reader-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-poi-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-poi-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-poi-awt-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-poi-awt-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/mapsforge-themes-0.9.1.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/mapsforge-themes-0.9.1-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="libs/svg-salamander-1.0.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="jar:platform:/resource/be-graphes-reloaded/libs/svg-salamander-1.0-javadoc.jar!/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
|
||||||
<classpathentry kind="lib" path="res"/>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
4
.gitignore
vendored
@ -6,12 +6,14 @@ bin
|
|||||||
target
|
target
|
||||||
doc
|
doc
|
||||||
*.jar
|
*.jar
|
||||||
|
.settings
|
||||||
|
.classpath
|
||||||
|
|
||||||
# Editor specific files and folders
|
# Editor specific files and folders
|
||||||
*~
|
*~
|
||||||
.project
|
.project
|
||||||
|
|
||||||
# Project speicific files and folders
|
# Project specific files and folders
|
||||||
*.mapfg
|
*.mapfg
|
||||||
*.mapgr
|
*.mapgr
|
||||||
*.path
|
*.path
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.8
|
|
@ -1,4 +0,0 @@
|
|||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
25
be-graphes-algos/pom.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<project
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
<artifactId>be-graphes-all</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>be-graphes-algos</artifactId>
|
||||||
|
<name>be-graphes-algos</name>
|
||||||
|
<url>http://maven.apache.org</url>
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
<artifactId>be-graphes-model</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo;
|
package org.insa.graphs.algorithm;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.algo;
|
package org.insa.graphs.algorithm;
|
||||||
|
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graph.GraphStatistics;
|
import org.insa.graphs.model.GraphStatistics;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for algorithm input data classes. This class contains the basic
|
* Base class for algorithm input data classes. This class contains the basic
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo;
|
package org.insa.graphs.algorithm;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
@ -38,6 +38,11 @@ public abstract class AbstractSolution {
|
|||||||
this.status = Status.UNKNOWN;
|
this.status = Status.UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
* @param status
|
||||||
|
*/
|
||||||
protected AbstractSolution(AbstractInputData data, Status status) {
|
protected AbstractSolution(AbstractInputData data, Status status) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.status = status;
|
this.status = status;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo;
|
package org.insa.graphs.algorithm;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
@ -7,11 +7,11 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
import org.insa.algo.shortestpath.AStarAlgorithm;
|
import org.insa.graphs.algorithm.shortestpath.AStarAlgorithm;
|
||||||
import org.insa.algo.shortestpath.BellmanFordAlgorithm;
|
import org.insa.graphs.algorithm.shortestpath.BellmanFordAlgorithm;
|
||||||
import org.insa.algo.shortestpath.DijkstraAlgorithm;
|
import org.insa.graphs.algorithm.shortestpath.DijkstraAlgorithm;
|
||||||
import org.insa.algo.shortestpath.ShortestPathAlgorithm;
|
import org.insa.graphs.algorithm.shortestpath.ShortestPathAlgorithm;
|
||||||
import org.insa.algo.weakconnectivity.WeaklyConnectedComponentsAlgorithm;
|
import org.insa.graphs.algorithm.weakconnectivity.WeaklyConnectedComponentsAlgorithm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory class used to register and retrieve algorithms based on their common
|
* Factory class used to register and retrieve algorithms based on their common
|
||||||
@ -43,10 +43,10 @@ public class AlgorithmFactory {
|
|||||||
* the given base algorithm.
|
* the given base algorithm.
|
||||||
*
|
*
|
||||||
* @param baseAlgorithm Base algorithm class that corresponds to the newly
|
* @param baseAlgorithm Base algorithm class that corresponds to the newly
|
||||||
* registered algorithm class (e.g., generic algorithm class for the
|
* registered algorithm class (e.g., generic algorithm
|
||||||
* problem).
|
* class for the problem).
|
||||||
* @param name Name for the registered algorithm class.
|
* @param name Name for the registered algorithm class.
|
||||||
* @param algoClass Algorithm class to register.
|
* @param algoClass Algorithm class to register.
|
||||||
*/
|
*/
|
||||||
public static void registerAlgorithm(Class<? extends AbstractAlgorithm<?>> baseAlgorithm,
|
public static void registerAlgorithm(Class<? extends AbstractAlgorithm<?>> baseAlgorithm,
|
||||||
String name, Class<? extends AbstractAlgorithm<?>> algoClass) {
|
String name, Class<? extends AbstractAlgorithm<?>> algoClass) {
|
||||||
@ -62,14 +62,14 @@ public class AlgorithmFactory {
|
|||||||
* an object equivalent to `new Algorithm(data)`.
|
* an object equivalent to `new Algorithm(data)`.
|
||||||
*
|
*
|
||||||
* @param algorithm Class of the algorithm to create.
|
* @param algorithm Class of the algorithm to create.
|
||||||
* @param data Input data for the algorithm.
|
* @param data Input data for the algorithm.
|
||||||
*
|
*
|
||||||
* @return A new instance of the given algorithm class using the given data.
|
* @return A new instance of the given algorithm class using the given data.
|
||||||
*
|
*
|
||||||
* @throws Exception if something wrong happens when constructing the object,
|
* @throws Exception if something wrong happens when constructing the object,
|
||||||
* i.e. the given input data does not correspond to the given algorithm
|
* i.e. the given input data does not correspond to the given
|
||||||
* and/or no constructor that takes a single parameter of type
|
* algorithm and/or no constructor that takes a single
|
||||||
* (data.getClass()) exists.
|
* parameter of type (data.getClass()) exists.
|
||||||
*/
|
*/
|
||||||
public static AbstractAlgorithm<?> createAlgorithm(
|
public static AbstractAlgorithm<?> createAlgorithm(
|
||||||
Class<? extends AbstractAlgorithm<?>> algorithm, AbstractInputData data)
|
Class<? extends AbstractAlgorithm<?>> algorithm, AbstractInputData data)
|
||||||
@ -96,7 +96,7 @@ public class AlgorithmFactory {
|
|||||||
* registerAlgorithm.
|
* registerAlgorithm.
|
||||||
*
|
*
|
||||||
* @param baseAlgorithm Base algorithm class for the algorithm to retrieve.
|
* @param baseAlgorithm Base algorithm class for the algorithm to retrieve.
|
||||||
* @param name Name of the algorithm to retrieve.
|
* @param name Name of the algorithm to retrieve.
|
||||||
*
|
*
|
||||||
* @return Class corresponding to the given name.
|
* @return Class corresponding to the given name.
|
||||||
*
|
*
|
||||||
@ -112,7 +112,7 @@ public class AlgorithmFactory {
|
|||||||
* for the given base algorithm class.
|
* for the given base algorithm class.
|
||||||
*
|
*
|
||||||
* @param baseAlgorithm Base algorithm class for the algorithm class names to
|
* @param baseAlgorithm Base algorithm class for the algorithm class names to
|
||||||
* retrieve.
|
* retrieve.
|
||||||
*
|
*
|
||||||
* @return Names of the currently registered algorithms.
|
* @return Names of the currently registered algorithms.
|
||||||
*
|
*
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.algo;
|
package org.insa.graphs.algorithm;
|
||||||
|
|
||||||
import org.insa.algo.AbstractInputData.Mode;
|
import org.insa.graphs.algorithm.AbstractInputData.Mode;
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.GraphStatistics;
|
import org.insa.graphs.model.GraphStatistics;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class can be used to indicate to an algorithm which arcs can be used and
|
* This class can be used to indicate to an algorithm which arcs can be used and
|
@ -1,14 +1,14 @@
|
|||||||
package org.insa.algo;
|
package org.insa.graphs.algorithm;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.insa.algo.AbstractInputData.Mode;
|
import org.insa.graphs.algorithm.AbstractInputData.Mode;
|
||||||
import org.insa.graph.AccessRestrictions.AccessMode;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.AccessRestrictions.AccessRestriction;
|
import org.insa.graphs.model.GraphStatistics;
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.AccessRestrictions.AccessMode;
|
||||||
import org.insa.graph.GraphStatistics;
|
import org.insa.graphs.model.AccessRestrictions.AccessRestriction;
|
||||||
|
|
||||||
public class ArcInspectorFactory {
|
public class ArcInspectorFactory {
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.algo.carpooling;
|
package org.insa.graphs.algorithm.carpooling;
|
||||||
|
|
||||||
import org.insa.algo.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
|
|
||||||
public abstract class CarPoolingAlgorithm extends AbstractAlgorithm<CarPoolingObserver> {
|
public abstract class CarPoolingAlgorithm extends AbstractAlgorithm<CarPoolingObserver> {
|
||||||
|
|
@ -0,0 +1,13 @@
|
|||||||
|
package org.insa.graphs.algorithm.carpooling;
|
||||||
|
|
||||||
|
import org.insa.graphs.algorithm.AbstractInputData;
|
||||||
|
import org.insa.graphs.algorithm.ArcInspector;
|
||||||
|
import org.insa.graphs.model.Graph;
|
||||||
|
|
||||||
|
public class CarPoolingData extends AbstractInputData {
|
||||||
|
|
||||||
|
protected CarPoolingData(Graph graph, ArcInspector arcFilter) {
|
||||||
|
super(graph, arcFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.carpooling;
|
package org.insa.graphs.algorithm.carpooling;
|
||||||
|
|
||||||
public class CarPoolingGraphicObserver implements CarPoolingObserver {
|
public class CarPoolingGraphicObserver implements CarPoolingObserver {
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
package org.insa.graphs.algorithm.carpooling;
|
||||||
|
|
||||||
|
public interface CarPoolingObserver {
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.algo.carpooling;
|
package org.insa.graphs.algorithm.carpooling;
|
||||||
|
|
||||||
import org.insa.algo.AbstractSolution;
|
import org.insa.graphs.algorithm.AbstractSolution;
|
||||||
|
|
||||||
public class CarPoolingSolution extends AbstractSolution {
|
public class CarPoolingSolution extends AbstractSolution {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.carpooling;
|
package org.insa.graphs.algorithm.carpooling;
|
||||||
|
|
||||||
public class CarPoolingTextObserver implements CarPoolingObserver {
|
public class CarPoolingTextObserver implements CarPoolingObserver {
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.algo.packageswitch;
|
package org.insa.graphs.algorithm.packageswitch;
|
||||||
|
|
||||||
import org.insa.algo.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
|
|
||||||
public abstract class PackageSwitchAlgorithm extends AbstractAlgorithm<PackageSwitchObserver> {
|
public abstract class PackageSwitchAlgorithm extends AbstractAlgorithm<PackageSwitchObserver> {
|
||||||
|
|
@ -0,0 +1,13 @@
|
|||||||
|
package org.insa.graphs.algorithm.packageswitch;
|
||||||
|
|
||||||
|
import org.insa.graphs.algorithm.AbstractInputData;
|
||||||
|
import org.insa.graphs.algorithm.ArcInspector;
|
||||||
|
import org.insa.graphs.model.Graph;
|
||||||
|
|
||||||
|
public class PackageSwitchData extends AbstractInputData {
|
||||||
|
|
||||||
|
protected PackageSwitchData(Graph graph, ArcInspector arcFilter) {
|
||||||
|
super(graph, arcFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.packageswitch;
|
package org.insa.graphs.algorithm.packageswitch;
|
||||||
|
|
||||||
public class PackageSwitchGraphicObserver implements PackageSwitchObserver {
|
public class PackageSwitchGraphicObserver implements PackageSwitchObserver {
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
package org.insa.graphs.algorithm.packageswitch;
|
||||||
|
|
||||||
|
public interface PackageSwitchObserver {
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.algo.packageswitch;
|
package org.insa.graphs.algorithm.packageswitch;
|
||||||
|
|
||||||
import org.insa.algo.AbstractSolution;
|
import org.insa.graphs.algorithm.AbstractSolution;
|
||||||
|
|
||||||
public class PackageSwitchSolution extends AbstractSolution {
|
public class PackageSwitchSolution extends AbstractSolution {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.packageswitch;
|
package org.insa.graphs.algorithm.packageswitch;
|
||||||
|
|
||||||
public class PackageSwitchTextObserver implements PackageSwitchObserver {
|
public class PackageSwitchTextObserver implements PackageSwitchObserver {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
public class AStarAlgorithm extends DijkstraAlgorithm {
|
public class AStarAlgorithm extends DijkstraAlgorithm {
|
||||||
|
|
@ -1,14 +1,14 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import org.insa.algo.AbstractSolution.Status;
|
import org.insa.graphs.algorithm.AbstractSolution.Status;
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.model.Path;
|
||||||
|
|
||||||
public class BellmanFordAlgorithm extends ShortestPathAlgorithm {
|
public class BellmanFordAlgorithm extends ShortestPathAlgorithm {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
public class DijkstraAlgorithm extends ShortestPathAlgorithm {
|
public class DijkstraAlgorithm extends ShortestPathAlgorithm {
|
||||||
|
|
||||||
@ -8,7 +8,7 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ShortestPathSolution doRun() {
|
protected ShortestPathSolution doRun() {
|
||||||
ShortestPathData data = getInputData();
|
final ShortestPathData data = getInputData();
|
||||||
ShortestPathSolution solution = null;
|
ShortestPathSolution solution = null;
|
||||||
// TODO:
|
// TODO:
|
||||||
return solution;
|
return solution;
|
@ -1,7 +1,7 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
import org.insa.algo.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public abstract class ShortestPathAlgorithm extends AbstractAlgorithm<ShortestPathObserver> {
|
public abstract class ShortestPathAlgorithm extends AbstractAlgorithm<ShortestPathObserver> {
|
||||||
|
|
@ -1,9 +1,9 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
import org.insa.algo.AbstractInputData;
|
import org.insa.graphs.algorithm.AbstractInputData;
|
||||||
import org.insa.algo.ArcInspector;
|
import org.insa.graphs.algorithm.ArcInspector;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class ShortestPathData extends AbstractInputData {
|
public class ShortestPathData extends AbstractInputData {
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public interface ShortestPathObserver {
|
public interface ShortestPathObserver {
|
||||||
|
|
@ -1,21 +1,14 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
import org.insa.algo.AbstractInputData.Mode;
|
import org.insa.graphs.algorithm.AbstractInputData.Mode;
|
||||||
import org.insa.algo.AbstractSolution;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Path;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.algorithm.AbstractSolution;
|
||||||
|
|
||||||
public class ShortestPathSolution extends AbstractSolution {
|
public class ShortestPathSolution extends AbstractSolution {
|
||||||
|
|
||||||
// Optimal solution.
|
// Optimal solution.
|
||||||
private Path path;
|
private final Path path;
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public ShortestPathSolution(ShortestPathData data) {
|
|
||||||
super(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new infeasible shortest-path solution for the given input and
|
* Create a new infeasible shortest-path solution for the given input and
|
||||||
@ -26,6 +19,7 @@ public class ShortestPathSolution extends AbstractSolution {
|
|||||||
*/
|
*/
|
||||||
public ShortestPathSolution(ShortestPathData data, Status status) {
|
public ShortestPathSolution(ShortestPathData data, Status status) {
|
||||||
super(data, status);
|
super(data, status);
|
||||||
|
this.path = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class ShortestPathTextObserver implements ShortestPathObserver {
|
public class ShortestPathTextObserver implements ShortestPathObserver {
|
||||||
|
|
@ -0,0 +1,205 @@
|
|||||||
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements a binary heap containing elements of type E.
|
||||||
|
*
|
||||||
|
* Note that all comparisons are based on the compareTo method, hence E must
|
||||||
|
* implement Comparable
|
||||||
|
*
|
||||||
|
* @author Mark Allen Weiss
|
||||||
|
* @author DLB
|
||||||
|
*/
|
||||||
|
public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
||||||
|
|
||||||
|
// Number of elements in heap.
|
||||||
|
private int currentSize;
|
||||||
|
|
||||||
|
// The heap array.
|
||||||
|
protected final ArrayList<E> array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new empty binary heap.
|
||||||
|
*/
|
||||||
|
public BinaryHeap() {
|
||||||
|
this.currentSize = 0;
|
||||||
|
this.array = new ArrayList<E>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a copy of the given heap.
|
||||||
|
*
|
||||||
|
* @param heap Binary heap to copy.
|
||||||
|
*/
|
||||||
|
public BinaryHeap(BinaryHeap<E> heap) {
|
||||||
|
this.currentSize = heap.currentSize;
|
||||||
|
this.array = new ArrayList<E>(heap.array);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an element at the given index.
|
||||||
|
*
|
||||||
|
* @param index Index at which the element should be set.
|
||||||
|
* @param value Element to set.
|
||||||
|
*/
|
||||||
|
private void arraySet(int index, E value) {
|
||||||
|
if (index == this.array.size()) {
|
||||||
|
this.array.add(value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.array.set(index, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Index of the parent of the given index.
|
||||||
|
*/
|
||||||
|
protected int indexParent(int index) {
|
||||||
|
return (index - 1) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Index of the left child of the given index.
|
||||||
|
*/
|
||||||
|
protected int indexLeft(int index) {
|
||||||
|
return index * 2 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal method to percolate up in the heap.
|
||||||
|
*
|
||||||
|
* @param index Index at which the percolate begins.
|
||||||
|
*/
|
||||||
|
private void percolateUp(int index) {
|
||||||
|
E x = this.array.get(index);
|
||||||
|
|
||||||
|
for (; index > 0
|
||||||
|
&& x.compareTo(this.array.get(indexParent(index))) < 0; index = indexParent(
|
||||||
|
index)) {
|
||||||
|
E moving_val = this.array.get(indexParent(index));
|
||||||
|
this.arraySet(index, moving_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.arraySet(index, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal method to percolate down in the heap.
|
||||||
|
*
|
||||||
|
* @param index Index at which the percolate begins.
|
||||||
|
*/
|
||||||
|
private void percolateDown(int index) {
|
||||||
|
int ileft = indexLeft(index);
|
||||||
|
int iright = ileft + 1;
|
||||||
|
|
||||||
|
if (ileft < this.currentSize) {
|
||||||
|
E current = this.array.get(index);
|
||||||
|
E left = this.array.get(ileft);
|
||||||
|
boolean hasRight = iright < this.currentSize;
|
||||||
|
E right = (hasRight) ? this.array.get(iright) : null;
|
||||||
|
|
||||||
|
if (!hasRight || left.compareTo(right) < 0) {
|
||||||
|
// Left is smaller
|
||||||
|
if (left.compareTo(current) < 0) {
|
||||||
|
this.arraySet(index, left);
|
||||||
|
this.arraySet(ileft, current);
|
||||||
|
this.percolateDown(ileft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Right is smaller
|
||||||
|
if (right.compareTo(current) < 0) {
|
||||||
|
this.arraySet(index, right);
|
||||||
|
this.arraySet(iright, current);
|
||||||
|
this.percolateDown(iright);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return this.currentSize == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return this.currentSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void insert(E x) {
|
||||||
|
int index = this.currentSize++;
|
||||||
|
this.arraySet(index, x);
|
||||||
|
this.percolateUp(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(E x) throws ElementNotFoundException {
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E findMin() throws EmptyPriorityQueueException {
|
||||||
|
if (isEmpty())
|
||||||
|
throw new EmptyPriorityQueueException();
|
||||||
|
return this.array.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E deleteMin() throws EmptyPriorityQueueException {
|
||||||
|
E minItem = findMin();
|
||||||
|
E lastItem = this.array.get(--this.currentSize);
|
||||||
|
this.arraySet(0, lastItem);
|
||||||
|
this.percolateDown(0);
|
||||||
|
return minItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a multi-lines string representing a sorted view of this binary heap.
|
||||||
|
*
|
||||||
|
* @return a string containing a sorted view this binary heap.
|
||||||
|
*/
|
||||||
|
public String toStringSorted() {
|
||||||
|
return BinaryHeapFormatter.toStringSorted(this, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a multi-lines string representing a sorted view of this binary heap.
|
||||||
|
*
|
||||||
|
* @param maxElement Maximum number of elements to display. or {@code -1} to
|
||||||
|
* display all the elements.
|
||||||
|
*
|
||||||
|
* @return a string containing a sorted view this binary heap.
|
||||||
|
*/
|
||||||
|
public String toStringSorted(int maxElement) {
|
||||||
|
return BinaryHeapFormatter.toStringSorted(this, maxElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a multi-lines string representing a tree view of this binary heap.
|
||||||
|
*
|
||||||
|
* @return a string containing a tree view of this binary heap.
|
||||||
|
*/
|
||||||
|
public String toStringTree() {
|
||||||
|
return BinaryHeapFormatter.toStringTree(this, Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a multi-lines string representing a tree view of this binary heap.
|
||||||
|
*
|
||||||
|
* @param maxDepth Maximum depth of the tree to display.
|
||||||
|
*
|
||||||
|
* @return a string containing a tree view of this binary heap.
|
||||||
|
*/
|
||||||
|
public String toStringTree(int maxDepth) {
|
||||||
|
return BinaryHeapFormatter.toStringTree(this, maxDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return BinaryHeapFormatter.toStringTree(this, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,198 @@
|
|||||||
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class BinaryHeapFormatter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is used by {@link #toStringTree}, and simply contains three string
|
||||||
|
* accumulating. This is an immutable class.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static class Context {
|
||||||
|
|
||||||
|
// Output text:
|
||||||
|
public final String acu;
|
||||||
|
|
||||||
|
// Margin to get back exactly under the current position:
|
||||||
|
public final String margin;
|
||||||
|
|
||||||
|
// Last margin used for the last child of a node. The markers are different:
|
||||||
|
public final String lastmargin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creaet a new {@code Context}.
|
||||||
|
*
|
||||||
|
* @param acu The accumulated string.
|
||||||
|
* @param margin The current margin.
|
||||||
|
* @param lastMargin The last margin used.
|
||||||
|
*/
|
||||||
|
public Context(String acu, String margin, String lastMargin) {
|
||||||
|
this.acu = acu;
|
||||||
|
this.margin = margin;
|
||||||
|
this.lastmargin = lastMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new context by appending newlines to this context.
|
||||||
|
*
|
||||||
|
* @param n Number of newlines to append.
|
||||||
|
*
|
||||||
|
* @return a new context with {@code n} newlines appended.
|
||||||
|
*/
|
||||||
|
public Context appendNewlines(int n) {
|
||||||
|
if (n <= 0) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return (new Context(this.acu + "\n" + this.margin, this.margin, this.lastmargin)
|
||||||
|
.appendNewlines(n - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new context by appending the given string to this context.
|
||||||
|
*
|
||||||
|
* @param count Number of spaces to add to the margin, or {@code null} to use
|
||||||
|
* the length of the string.
|
||||||
|
* @param text String to append.
|
||||||
|
*
|
||||||
|
* @return a new context with {@code text} appended.
|
||||||
|
*/
|
||||||
|
public Context appendText(Integer count, String text) {
|
||||||
|
int cnt = (count == null) ? text.length() : count;
|
||||||
|
final String spaces = new String(new char[cnt]).replace('\0', ' ');
|
||||||
|
return new Context(this.acu + text, this.margin + spaces, this.lastmargin + spaces);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new context by appending a branch to this context.
|
||||||
|
*
|
||||||
|
* @param n Number of spaces to add to the margin, or {@code null} to use
|
||||||
|
* the length of the string.
|
||||||
|
* @param label Name of the branch.
|
||||||
|
*
|
||||||
|
* @return a new context with the branch appended.
|
||||||
|
*/
|
||||||
|
public Context appendBranch(Integer count, String label) {
|
||||||
|
final Context ctxt = this.appendText(count, label);
|
||||||
|
|
||||||
|
if (count == null) {
|
||||||
|
return new Context(ctxt.acu + "_", ctxt.margin + "|", ctxt.margin + " ");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new Context(ctxt.acu, ctxt.margin + "|", ctxt.margin + " ")
|
||||||
|
.appendNewlines(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Input : ready to write the current node at the current context position.
|
||||||
|
* Output : the last character of acu is the last character of the current node.
|
||||||
|
*/
|
||||||
|
protected static <E extends Comparable<E>> Context toStringLoop(BinaryHeap<E> heap,
|
||||||
|
Context ctxt, int node, int max_depth) {
|
||||||
|
|
||||||
|
if (max_depth < 0) {
|
||||||
|
return ctxt.appendText(null, "...");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
E nodeval = heap.array.get(node);
|
||||||
|
String nodevals = nodeval.toString();
|
||||||
|
|
||||||
|
ArrayList<Integer> childs = new ArrayList<Integer>();
|
||||||
|
// Add childs
|
||||||
|
int index_left = heap.indexLeft(node);
|
||||||
|
int index_right = index_left + 1;
|
||||||
|
|
||||||
|
if (index_left < heap.size()) {
|
||||||
|
childs.add(index_left);
|
||||||
|
}
|
||||||
|
if (index_right < heap.size()) {
|
||||||
|
childs.add(index_right);
|
||||||
|
}
|
||||||
|
|
||||||
|
Context ctxt2 = childs.isEmpty() ? ctxt.appendText(null, nodevals)
|
||||||
|
: ctxt.appendBranch(1, nodevals);
|
||||||
|
|
||||||
|
for (int ch = 0; ch < childs.size(); ch++) {
|
||||||
|
boolean is_last = (ch == childs.size() - 1);
|
||||||
|
int child = childs.get(ch);
|
||||||
|
|
||||||
|
if (is_last) {
|
||||||
|
Context ctxt3 = new Context(ctxt2.acu, ctxt2.lastmargin, ctxt2.lastmargin);
|
||||||
|
ctxt2 = new Context(toStringLoop(heap, ctxt3.appendText(null, "___"), child,
|
||||||
|
max_depth - 1).acu, ctxt2.margin, ctxt2.lastmargin);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ctxt2 = new Context(toStringLoop(heap, ctxt2.appendText(null, "___"), child,
|
||||||
|
max_depth - 1).acu, ctxt2.margin, ctxt2.lastmargin).appendNewlines(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctxt2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a multi-lines string representing a tree view of the given binary
|
||||||
|
* heap.
|
||||||
|
*
|
||||||
|
* @param heap The binary heap to display.
|
||||||
|
* @param maxDepth Maximum depth of the tree to display.
|
||||||
|
*
|
||||||
|
* @return a string containing a tree view of the given binary heap.
|
||||||
|
*/
|
||||||
|
public static <E extends Comparable<E>> String toStringTree(BinaryHeap<E> heap, int maxDepth) {
|
||||||
|
final Context init_context = new Context(" ", " ", " ");
|
||||||
|
final Context result = toStringLoop(heap, init_context, 0, maxDepth);
|
||||||
|
return result.acu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a multi-lines string representing a sorted view of the given binary
|
||||||
|
* heap.
|
||||||
|
*
|
||||||
|
* @param heap The binary heap to display.
|
||||||
|
* @param maxElement Maximum number of elements to display. or {@code -1} to
|
||||||
|
* display all the elements.
|
||||||
|
*
|
||||||
|
* @return a string containing a sorted view the given binary heap.
|
||||||
|
*/
|
||||||
|
public static <E extends Comparable<E>> String toStringSorted(BinaryHeap<E> heap,
|
||||||
|
int max_elements) {
|
||||||
|
String result = "";
|
||||||
|
final BinaryHeap<E> copy = new BinaryHeap<E>(heap);
|
||||||
|
|
||||||
|
final String truncate;
|
||||||
|
if (max_elements < 0 || max_elements >= heap.size()) {
|
||||||
|
truncate = "";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
truncate = ", only " + max_elements + " elements are shown";
|
||||||
|
}
|
||||||
|
|
||||||
|
result += "======== Sorted HEAP (size = " + heap.size() + truncate + ") ========\n\n";
|
||||||
|
|
||||||
|
while (!copy.isEmpty() && max_elements-- != 0) {
|
||||||
|
result += copy.deleteMin() + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
result += "\n-------- End of heap --------";
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
final BinaryHeap<Integer> heap = new BinaryHeap<Integer>();
|
||||||
|
|
||||||
|
for (int i = 0; i < 12; i++) {
|
||||||
|
heap.insert(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println(heap.toStringSorted(-1));
|
||||||
|
System.out.println(heap.toStringTree(6));
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
public class ElementNotFoundException extends RuntimeException {
|
public class ElementNotFoundException extends RuntimeException {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
public class EmptyPriorityQueueException extends RuntimeException {
|
public class EmptyPriorityQueueException extends RuntimeException {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing a basic priority queue.
|
* Interface representing a basic priority queue.
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.algo.weakconnectivity;
|
package org.insa.graphs.algorithm.weakconnectivity;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public interface WeaklyConnectedComponentObserver {
|
public interface WeaklyConnectedComponentObserver {
|
||||||
|
|
@ -1,9 +1,9 @@
|
|||||||
package org.insa.algo.weakconnectivity;
|
package org.insa.graphs.algorithm.weakconnectivity;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentTextObserver implements WeaklyConnectedComponentObserver {
|
public class WeaklyConnectedComponentTextObserver implements WeaklyConnectedComponentObserver {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.weakconnectivity;
|
package org.insa.graphs.algorithm.weakconnectivity;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -6,11 +6,11 @@ import java.util.HashSet;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
|
||||||
import org.insa.algo.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
import org.insa.algo.AbstractSolution.Status;
|
import org.insa.graphs.algorithm.AbstractSolution.Status;
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentsAlgorithm
|
public class WeaklyConnectedComponentsAlgorithm
|
||||||
extends AbstractAlgorithm<WeaklyConnectedComponentObserver> {
|
extends AbstractAlgorithm<WeaklyConnectedComponentObserver> {
|
@ -1,7 +1,7 @@
|
|||||||
package org.insa.algo.weakconnectivity;
|
package org.insa.graphs.algorithm.weakconnectivity;
|
||||||
|
|
||||||
import org.insa.algo.AbstractInputData;
|
import org.insa.graphs.algorithm.AbstractInputData;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentsData extends AbstractInputData {
|
public class WeaklyConnectedComponentsData extends AbstractInputData {
|
||||||
|
|
@ -1,9 +1,9 @@
|
|||||||
package org.insa.algo.weakconnectivity;
|
package org.insa.graphs.algorithm.weakconnectivity;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.insa.algo.AbstractSolution;
|
import org.insa.graphs.algorithm.AbstractSolution;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentsSolution extends AbstractSolution {
|
public class WeaklyConnectedComponentsSolution extends AbstractSolution {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
public class BinaryHeapTest extends PriorityQueueTest {
|
public class BinaryHeapTest extends PriorityQueueTest {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
public class BinarySearchTreeTest extends PriorityQueueTest {
|
public class BinarySearchTreeTest extends PriorityQueueTest {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.algo.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
84
be-graphes-gui/pom.xml
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<project
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
<artifactId>be-graphes-all</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<mapsforge.version>0.13.0</mapsforge.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<artifactId>be-graphes-gui</artifactId>
|
||||||
|
<name>be-graphes-gui</name>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jitpack.io</id>
|
||||||
|
<url>https://jitpack.io</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
<artifactId>be-graphes-model</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
<artifactId>be-graphes-algos</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mapsforge/mapsforge-core -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sf.kxml</groupId>
|
||||||
|
<artifactId>kxml2</artifactId>
|
||||||
|
<version>2.3.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mapsforge/mapsforge-map-reader -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapsforge</groupId>
|
||||||
|
<artifactId>mapsforge-themes</artifactId>
|
||||||
|
<version>${mapsforge.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mapsforge/mapsforge-map -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapsforge</groupId>
|
||||||
|
<artifactId>mapsforge-map</artifactId>
|
||||||
|
<version>${mapsforge.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mapsforge/mapsforge-map-awt -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapsforge</groupId>
|
||||||
|
<artifactId>mapsforge-map-awt</artifactId>
|
||||||
|
<version>${mapsforge.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mapsforge/mapsforge-map-reader -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapsforge</groupId>
|
||||||
|
<artifactId>mapsforge-themes</artifactId>
|
||||||
|
<version>${mapsforge.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mapsforge/mapsforge-map-reader -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapsforge</groupId>
|
||||||
|
<artifactId>mapsforge-map-reader</artifactId>
|
||||||
|
<version>${mapsforge.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
@ -22,15 +22,14 @@ import javax.swing.JLabel;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
|
|
||||||
import org.insa.algo.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
import org.insa.algo.AlgorithmFactory;
|
import org.insa.graphs.algorithm.AlgorithmFactory;
|
||||||
import org.insa.algo.ArcInspector;
|
import org.insa.graphs.algorithm.ArcInspector;
|
||||||
import org.insa.algo.ArcInspectorFactory;
|
import org.insa.graphs.algorithm.ArcInspectorFactory;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.gui.NodesInputPanel.InputChangedEvent;
|
||||||
import org.insa.graphics.NodesInputPanel.InputChangedEvent;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.utils.ColorUtils;
|
||||||
import org.insa.graphics.drawing.components.MapViewDrawing;
|
import org.insa.graphs.model.Node;
|
||||||
import org.insa.graphics.utils.ColorUtils;
|
|
||||||
|
|
||||||
public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||||
|
|
||||||
@ -118,9 +117,6 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
// Graphic / Text checkbox observer
|
// Graphic / Text checkbox observer
|
||||||
private final JCheckBox graphicObserverCheckbox, textualObserverCheckbox;
|
private final JCheckBox graphicObserverCheckbox, textualObserverCheckbox;
|
||||||
|
|
||||||
// Drawing
|
|
||||||
private Drawing drawing = null;
|
|
||||||
|
|
||||||
private JButton startAlgoButton;
|
private JButton startAlgoButton;
|
||||||
|
|
||||||
// Start listeners
|
// Start listeners
|
||||||
@ -360,7 +356,7 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
for (JComponent component: components) {
|
for (JComponent component: components) {
|
||||||
component.setEnabled(enabled);
|
component.setEnabled(enabled);
|
||||||
}
|
}
|
||||||
graphicObserverCheckbox.setEnabled(enabled && !(drawing instanceof MapViewDrawing));
|
graphicObserverCheckbox.setEnabled(enabled);
|
||||||
enabled = enabled && allNotNull(this.nodesInputPanel.getNodeForInputs());
|
enabled = enabled && allNotNull(this.nodesInputPanel.getNodeForInputs());
|
||||||
startAlgoButton.setEnabled(enabled);
|
startAlgoButton.setEnabled(enabled);
|
||||||
}
|
}
|
||||||
@ -376,15 +372,6 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDrawingLoaded(Drawing oldDrawing, Drawing newDrawing) {
|
public void onDrawingLoaded(Drawing oldDrawing, Drawing newDrawing) {
|
||||||
if (newDrawing instanceof MapViewDrawing) {
|
|
||||||
graphicObserverCheckbox.setSelected(false);
|
|
||||||
graphicObserverCheckbox.setEnabled(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
graphicObserverCheckbox.setSelected(true);
|
|
||||||
graphicObserverCheckbox.setEnabled(true);
|
|
||||||
}
|
|
||||||
this.drawing = newDrawing;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
|
|
||||||
public interface DrawingChangeListener {
|
public interface DrawingChangeListener {
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
|
|
||||||
public interface GraphChangeListener {
|
public interface GraphChangeListener {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
|
|
||||||
@ -11,10 +11,10 @@ import javax.swing.JPanel;
|
|||||||
import javax.swing.JProgressBar;
|
import javax.swing.JProgressBar;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
|
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.model.Node;
|
||||||
import org.insa.graph.RoadInformation;
|
import org.insa.graphs.model.RoadInformation;
|
||||||
import org.insa.graph.io.GraphReaderObserver;
|
import org.insa.graphs.model.io.GraphReaderObserver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One-time use GraphReaderObserver that display progress in three different
|
* One-time use GraphReaderObserver that display progress in three different
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
@ -21,13 +21,13 @@ import javax.swing.JTextField;
|
|||||||
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentEvent;
|
||||||
import javax.swing.event.DocumentListener;
|
import javax.swing.event.DocumentListener;
|
||||||
|
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.gui.drawing.Drawing.AlphaMode;
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.gui.drawing.DrawingClickListener;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.drawing.overlays.MarkerOverlay;
|
||||||
import org.insa.graphics.drawing.Drawing.AlphaMode;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graphics.drawing.DrawingClickListener;
|
import org.insa.graphs.model.Node;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerOverlay;
|
import org.insa.graphs.model.Point;
|
||||||
|
|
||||||
public class NodesInputPanel extends JPanel
|
public class NodesInputPanel extends JPanel
|
||||||
implements DrawingClickListener, DrawingChangeListener, GraphChangeListener {
|
implements DrawingClickListener, DrawingChangeListener, GraphChangeListener {
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
@ -32,14 +32,14 @@ import javax.swing.border.EmptyBorder;
|
|||||||
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeEvent;
|
||||||
import javax.swing.event.ChangeListener;
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.gui.drawing.overlays.PathOverlay;
|
||||||
import org.insa.graph.io.BinaryPathWriter;
|
import org.insa.graphs.gui.utils.ColorUtils;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.utils.FileUtils;
|
||||||
import org.insa.graphics.drawing.overlays.PathOverlay;
|
import org.insa.graphs.gui.utils.FileUtils.FolderType;
|
||||||
import org.insa.graphics.utils.ColorUtils;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graphics.utils.FileUtils;
|
import org.insa.graphs.model.Path;
|
||||||
import org.insa.graphics.utils.FileUtils.FolderType;
|
import org.insa.graphs.model.io.BinaryPathWriter;
|
||||||
|
|
||||||
public class PathsPanel extends JPanel implements DrawingChangeListener, GraphChangeListener {
|
public class PathsPanel extends JPanel implements DrawingChangeListener, GraphChangeListener {
|
||||||
|
|
||||||
@ -232,9 +232,8 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
if (chooser
|
if (chooser
|
||||||
.showSaveDialog(getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) {
|
.showSaveDialog(getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) {
|
||||||
File file = chooser.getSelectedFile();
|
File file = chooser.getSelectedFile();
|
||||||
try {
|
try (BinaryPathWriter writer = new BinaryPathWriter(new DataOutputStream(
|
||||||
BinaryPathWriter writer = new BinaryPathWriter(new DataOutputStream(
|
new BufferedOutputStream(new FileOutputStream(file))))) {
|
||||||
new BufferedOutputStream(new FileOutputStream(file))));
|
|
||||||
writer.writePath(path);
|
writer.writePath(path);
|
||||||
}
|
}
|
||||||
catch (IOException e1) {
|
catch (IOException e1) {
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
@ -19,12 +19,12 @@ import javax.swing.JPanel;
|
|||||||
import javax.swing.border.CompoundBorder;
|
import javax.swing.border.CompoundBorder;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
|
|
||||||
import org.insa.algo.AbstractInputData;
|
import org.insa.graphs.algorithm.AbstractInputData;
|
||||||
import org.insa.algo.AbstractSolution;
|
import org.insa.graphs.algorithm.AbstractSolution;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.gui.drawing.overlays.PathOverlay;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graphics.drawing.overlays.PathOverlay;
|
import org.insa.graphs.model.Path;
|
||||||
|
|
||||||
public class SolutionPanel extends JPanel implements DrawingChangeListener, GraphChangeListener {
|
public class SolutionPanel extends JPanel implements DrawingChangeListener, GraphChangeListener {
|
||||||
|
|
||||||
@ -122,6 +122,7 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see java.lang.Object#toString()
|
* @see java.lang.Object#toString()
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics;
|
package org.insa.graphs.gui;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
@ -1,9 +1,9 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graph.RoadInformation.RoadType;
|
import org.insa.graphs.model.RoadInformation.RoadType;
|
||||||
|
|
||||||
public class BasicGraphPalette implements GraphPalette {
|
public class BasicGraphPalette implements GraphPalette {
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
|
|
||||||
public class BlackAndWhiteGraphPalette extends BasicGraphPalette {
|
public class BlackAndWhiteGraphPalette extends BasicGraphPalette {
|
||||||
|
|
@ -1,13 +1,13 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.gui.drawing.overlays.MarkerOverlay;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.gui.drawing.overlays.PathOverlay;
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerOverlay;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graphics.drawing.overlays.PathOverlay;
|
import org.insa.graphs.model.Path;
|
||||||
import org.insa.graphics.drawing.overlays.PointSetOverlay;
|
import org.insa.graphs.model.Point;
|
||||||
|
|
||||||
public interface Drawing {
|
public interface Drawing {
|
||||||
|
|
@ -1,14 +1,14 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.model.Point;
|
||||||
|
|
||||||
public interface DrawingClickListener {
|
public interface DrawingClickListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event triggered when a click is made on the map.
|
* Event triggered when a click is made on the map.
|
||||||
*
|
*
|
||||||
* @param point Position (on the map) of the mouse click.
|
* @param point Position (on the map) of the mouse click.
|
||||||
*/
|
*/
|
||||||
public void mouseClicked(Point point);
|
public void mouseClicked(Point point);
|
||||||
|
|
||||||
}
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.model.Arc;
|
||||||
|
|
||||||
public interface GraphPalette {
|
public interface GraphPalette {
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
|
||||||
import org.insa.graph.GraphStatistics.BoundingBox;
|
import org.insa.graphs.model.GraphStatistics.BoundingBox;
|
||||||
|
|
||||||
public class MercatorProjection implements Projection {
|
public class MercatorProjection implements Projection {
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
import org.insa.graph.GraphStatistics.BoundingBox;
|
import org.insa.graphs.model.GraphStatistics.BoundingBox;
|
||||||
|
|
||||||
public class PlateCarreProjection implements Projection {
|
public class PlateCarreProjection implements Projection {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphs.gui.drawing;
|
||||||
|
|
||||||
public interface Projection {
|
public interface Projection {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.components;
|
package org.insa.graphs.gui.drawing.components;
|
||||||
|
|
||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
@ -20,24 +20,24 @@ import java.util.List;
|
|||||||
|
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
import org.insa.graph.Arc;
|
import org.insa.graphs.gui.drawing.BasicGraphPalette;
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graph.GraphStatistics.BoundingBox;
|
import org.insa.graphs.gui.drawing.DrawingClickListener;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.gui.drawing.GraphPalette;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.gui.drawing.MercatorProjection;
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.gui.drawing.PlateCarreProjection;
|
||||||
import org.insa.graphics.drawing.BasicGraphPalette;
|
import org.insa.graphs.gui.drawing.Projection;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.drawing.overlays.MarkerOverlay;
|
||||||
import org.insa.graphics.drawing.DrawingClickListener;
|
import org.insa.graphs.gui.drawing.overlays.MarkerUtils;
|
||||||
import org.insa.graphics.drawing.GraphPalette;
|
import org.insa.graphs.gui.drawing.overlays.Overlay;
|
||||||
import org.insa.graphics.drawing.MercatorProjection;
|
import org.insa.graphs.gui.drawing.overlays.PathOverlay;
|
||||||
import org.insa.graphics.drawing.PlateCarreProjection;
|
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
||||||
import org.insa.graphics.drawing.Projection;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerOverlay;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerUtils;
|
import org.insa.graphs.model.Node;
|
||||||
import org.insa.graphics.drawing.overlays.Overlay;
|
import org.insa.graphs.model.Path;
|
||||||
import org.insa.graphics.drawing.overlays.PathOverlay;
|
import org.insa.graphs.model.Point;
|
||||||
import org.insa.graphics.drawing.overlays.PointSetOverlay;
|
import org.insa.graphs.model.GraphStatistics.BoundingBox;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
@ -1,465 +1,521 @@
|
|||||||
package org.insa.graphics.drawing.components;
|
package org.insa.graphs.gui.drawing.components;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.UUID;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
import org.insa.graph.Arc;
|
import java.util.stream.Collectors;
|
||||||
import org.insa.graph.Graph;
|
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.gui.drawing.DrawingClickListener;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.drawing.GraphPalette;
|
||||||
import org.insa.graphics.drawing.DrawingClickListener;
|
import org.insa.graphs.gui.drawing.overlays.MarkerAutoScaling;
|
||||||
import org.insa.graphics.drawing.GraphPalette;
|
import org.insa.graphs.gui.drawing.overlays.MarkerOverlay;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerAutoScaling;
|
import org.insa.graphs.gui.drawing.overlays.MarkerUtils;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerOverlay;
|
import org.insa.graphs.gui.drawing.overlays.Overlay;
|
||||||
import org.insa.graphics.drawing.overlays.MarkerUtils;
|
import org.insa.graphs.gui.drawing.overlays.PathOverlay;
|
||||||
import org.insa.graphics.drawing.overlays.Overlay;
|
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
||||||
import org.insa.graphics.drawing.overlays.PathOverlay;
|
import org.insa.graphs.gui.drawing.overlays.PolylineAutoScaling;
|
||||||
import org.insa.graphics.drawing.overlays.PointSetOverlay;
|
import org.insa.graphs.model.Arc;
|
||||||
import org.insa.graphics.drawing.overlays.PolylineAutoScaling;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.mapsforge.core.graphics.GraphicFactory;
|
import org.insa.graphs.model.Path;
|
||||||
import org.mapsforge.core.model.BoundingBox;
|
import org.insa.graphs.model.Point;
|
||||||
import org.mapsforge.core.model.LatLong;
|
import org.mapsforge.core.graphics.GraphicFactory;
|
||||||
import org.mapsforge.core.model.MapPosition;
|
import org.mapsforge.core.model.BoundingBox;
|
||||||
import org.mapsforge.core.util.LatLongUtils;
|
import org.mapsforge.core.model.LatLong;
|
||||||
import org.mapsforge.core.util.Parameters;
|
import org.mapsforge.core.model.MapPosition;
|
||||||
import org.mapsforge.map.awt.graphics.AwtGraphicFactory;
|
import org.mapsforge.core.util.LatLongUtils;
|
||||||
import org.mapsforge.map.awt.util.AwtUtil;
|
import org.mapsforge.core.util.Parameters;
|
||||||
import org.mapsforge.map.awt.view.MapView;
|
import org.mapsforge.map.awt.graphics.AwtGraphicFactory;
|
||||||
import org.mapsforge.map.datastore.MapDataStore;
|
import org.mapsforge.map.awt.util.AwtUtil;
|
||||||
import org.mapsforge.map.layer.Layer;
|
import org.mapsforge.map.awt.view.MapView;
|
||||||
import org.mapsforge.map.layer.Layers;
|
import org.mapsforge.map.datastore.MapDataStore;
|
||||||
import org.mapsforge.map.layer.cache.TileCache;
|
import org.mapsforge.map.layer.Layer;
|
||||||
import org.mapsforge.map.layer.hills.HillsRenderConfig;
|
import org.mapsforge.map.layer.Layers;
|
||||||
import org.mapsforge.map.layer.overlay.Marker;
|
import org.mapsforge.map.layer.cache.TileCache;
|
||||||
import org.mapsforge.map.layer.renderer.TileRendererLayer;
|
import org.mapsforge.map.layer.hills.HillsRenderConfig;
|
||||||
import org.mapsforge.map.model.DisplayModel;
|
import org.mapsforge.map.layer.overlay.Marker;
|
||||||
import org.mapsforge.map.model.MapViewPosition;
|
import org.mapsforge.map.layer.overlay.Polygon;
|
||||||
import org.mapsforge.map.model.Model;
|
import org.mapsforge.map.layer.renderer.TileRendererLayer;
|
||||||
import org.mapsforge.map.reader.MapFile;
|
import org.mapsforge.map.model.DisplayModel;
|
||||||
import org.mapsforge.map.rendertheme.InternalRenderTheme;
|
import org.mapsforge.map.model.IMapViewPosition;
|
||||||
|
import org.mapsforge.map.model.Model;
|
||||||
/**
|
import org.mapsforge.map.reader.MapFile;
|
||||||
*
|
import org.mapsforge.map.rendertheme.InternalRenderTheme;
|
||||||
*/
|
|
||||||
public class MapViewDrawing extends MapView implements Drawing {
|
/**
|
||||||
|
*
|
||||||
/**
|
*/
|
||||||
*
|
public class MapViewDrawing extends MapView implements Drawing {
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 8606967833704938092L;
|
/**
|
||||||
|
*
|
||||||
/**
|
*/
|
||||||
* Base Overlay for MapViewDrawing overlays.
|
private static final long serialVersionUID = 8606967833704938092L;
|
||||||
*
|
|
||||||
*/
|
/**
|
||||||
private abstract class MapViewOverlay implements Overlay {
|
* Base Overlay for MapViewDrawing overlays.
|
||||||
|
*
|
||||||
// Marker associated.
|
*/
|
||||||
protected Layer[] layers;
|
private abstract class MapViewOverlay implements Overlay {
|
||||||
|
|
||||||
// Current color
|
// Marker associated.
|
||||||
protected Color color;
|
protected Layer[] layers;
|
||||||
|
|
||||||
public MapViewOverlay(Layer[] layers, Color color) {
|
// Current color
|
||||||
this.layers = layers;
|
protected Color color;
|
||||||
for (Layer layer: this.layers) {
|
|
||||||
MapViewDrawing.this.getLayerManager().getLayers().add(layer);
|
public MapViewOverlay(Layer[] layers, Color color) {
|
||||||
}
|
this.layers = layers;
|
||||||
this.color = color;
|
for (Layer layer: this.layers) {
|
||||||
}
|
MapViewDrawing.this.getLayerManager().getLayers().add(layer);
|
||||||
|
}
|
||||||
@Override
|
this.color = color;
|
||||||
public void setColor(Color color) {
|
}
|
||||||
this.color = color;
|
|
||||||
}
|
@Override
|
||||||
|
public void setColor(Color color) {
|
||||||
@Override
|
this.color = color;
|
||||||
public Color getColor() {
|
}
|
||||||
return this.color;
|
|
||||||
}
|
@Override
|
||||||
|
public Color getColor() {
|
||||||
@Override
|
return this.color;
|
||||||
public void setVisible(boolean visible) {
|
}
|
||||||
for (Layer layer: layers) {
|
|
||||||
layer.setVisible(visible);
|
@Override
|
||||||
}
|
public void setVisible(boolean visible) {
|
||||||
}
|
for (Layer layer: layers) {
|
||||||
|
layer.setVisible(visible);
|
||||||
@Override
|
}
|
||||||
public boolean isVisible() {
|
}
|
||||||
if (this.layers.length == 0) {
|
|
||||||
return true;
|
@Override
|
||||||
}
|
public boolean isVisible() {
|
||||||
return this.layers[0].isVisible();
|
if (this.layers.length == 0) {
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
@Override
|
return this.layers[0].isVisible();
|
||||||
public void delete() {
|
}
|
||||||
Layers mlayers = MapViewDrawing.this.getLayerManager().getLayers();
|
|
||||||
for (Layer layer: layers) {
|
@Override
|
||||||
mlayers.remove(layer);
|
public void delete() {
|
||||||
}
|
Layers mlayers = MapViewDrawing.this.getLayerManager().getLayers();
|
||||||
}
|
for (Layer layer: layers) {
|
||||||
|
mlayers.remove(layer);
|
||||||
@Override
|
}
|
||||||
public void redraw() {
|
}
|
||||||
MapViewDrawing.this.getLayerManager().redrawLayers();
|
|
||||||
}
|
@Override
|
||||||
};
|
public void redraw() {
|
||||||
|
MapViewDrawing.this.getLayerManager().redrawLayers();
|
||||||
/**
|
}
|
||||||
* MarkerOverlay for MapViewDrawing.
|
};
|
||||||
*
|
|
||||||
*/
|
/**
|
||||||
private class MapViewMarkerOverlay extends MapViewOverlay implements MarkerOverlay {
|
* MarkerOverlay for MapViewDrawing.
|
||||||
|
*
|
||||||
private final AlphaMode alphaMode;
|
*/
|
||||||
private Color innerColor;
|
private class MapViewMarkerOverlay extends MapViewOverlay implements MarkerOverlay {
|
||||||
|
|
||||||
public MapViewMarkerOverlay(Marker marker, Color outer, Color innerColor,
|
private final AlphaMode alphaMode;
|
||||||
AlphaMode alphaMode) {
|
private Color innerColor;
|
||||||
super(new Layer[] { marker }, outer);
|
|
||||||
this.innerColor = innerColor;
|
public MapViewMarkerOverlay(Marker marker, Color outer, Color innerColor,
|
||||||
this.alphaMode = alphaMode;
|
AlphaMode alphaMode) {
|
||||||
}
|
super(new Layer[] { marker }, outer);
|
||||||
|
this.innerColor = innerColor;
|
||||||
@Override
|
this.alphaMode = alphaMode;
|
||||||
public Point getPoint() {
|
}
|
||||||
Marker marker = (Marker) super.layers[0];
|
|
||||||
return new Point((float) marker.getLatLong().getLongitude(),
|
@Override
|
||||||
(float) marker.getLatLong().getLatitude());
|
public Point getPoint() {
|
||||||
}
|
Marker marker = (Marker) super.layers[0];
|
||||||
|
return new Point((float) marker.getLatLong().getLongitude(),
|
||||||
@Override
|
(float) marker.getLatLong().getLatitude());
|
||||||
public void setColor(Color outer) {
|
}
|
||||||
this.innerColor = this.innerColor.equals(this.color) ? outer : this.innerColor;
|
|
||||||
super.setColor(color);
|
@Override
|
||||||
MarkerAutoScaling marker = (MarkerAutoScaling) super.layers[0];
|
public void setColor(Color outer) {
|
||||||
marker.setImage(MarkerUtils.getMarkerForColor(color, this.innerColor, this.alphaMode));
|
this.innerColor = this.innerColor.equals(this.color) ? outer : this.innerColor;
|
||||||
}
|
super.setColor(color);
|
||||||
|
MarkerAutoScaling marker = (MarkerAutoScaling) super.layers[0];
|
||||||
@Override
|
marker.setImage(MarkerUtils.getMarkerForColor(color, this.innerColor, this.alphaMode));
|
||||||
public void moveTo(Point point) {
|
}
|
||||||
MarkerAutoScaling marker = (MarkerAutoScaling) this.layers[0];
|
|
||||||
this.delete();
|
@Override
|
||||||
marker = new MarkerAutoScaling(convertPoint(point), marker.getImage());
|
public void moveTo(Point point) {
|
||||||
this.layers[0] = marker;
|
MarkerAutoScaling marker = (MarkerAutoScaling) this.layers[0];
|
||||||
MapViewDrawing.this.getLayerManager().getLayers().add(marker);
|
this.delete();
|
||||||
}
|
marker = new MarkerAutoScaling(convertPoint(point), marker.getImage());
|
||||||
|
this.layers[0] = marker;
|
||||||
};
|
MapViewDrawing.this.getLayerManager().getLayers().add(marker);
|
||||||
|
}
|
||||||
/**
|
|
||||||
* PathOverlay for MapViewDrawing.
|
};
|
||||||
*
|
|
||||||
*/
|
/**
|
||||||
private class MapViewPathOverlay extends MapViewOverlay implements PathOverlay {
|
* PathOverlay for MapViewDrawing.
|
||||||
|
*
|
||||||
public MapViewPathOverlay(PolylineAutoScaling path, MarkerAutoScaling origin,
|
*/
|
||||||
MarkerAutoScaling destination) {
|
private class MapViewPathOverlay extends MapViewOverlay implements PathOverlay {
|
||||||
super(new Layer[] { path, origin, destination }, path.getColor());
|
|
||||||
}
|
public MapViewPathOverlay(PolylineAutoScaling path, MarkerAutoScaling origin,
|
||||||
|
MarkerAutoScaling destination) {
|
||||||
public MapViewPathOverlay(PolylineAutoScaling path) {
|
super(new Layer[] { path, origin, destination }, path.getColor());
|
||||||
super(new Layer[] { path }, path.getColor());
|
}
|
||||||
}
|
|
||||||
|
public MapViewPathOverlay(PolylineAutoScaling path) {
|
||||||
@Override
|
super(new Layer[] { path }, path.getColor());
|
||||||
public void setColor(Color color) {
|
}
|
||||||
super.setColor(color);
|
|
||||||
((PolylineAutoScaling) this.layers[0]).setColor(color);
|
@Override
|
||||||
((MarkerAutoScaling) this.layers[1])
|
public void setColor(Color color) {
|
||||||
.setImage(MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
super.setColor(color);
|
||||||
((MarkerAutoScaling) this.layers[2])
|
((PolylineAutoScaling) this.layers[0]).setColor(color);
|
||||||
.setImage(MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
((MarkerAutoScaling) this.layers[1])
|
||||||
}
|
.setImage(MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
||||||
|
((MarkerAutoScaling) this.layers[2])
|
||||||
}
|
.setImage(MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
||||||
|
}
|
||||||
/**
|
|
||||||
* PointSetOverlay for MapViewDrawing - Not currently implemented.
|
}
|
||||||
*
|
|
||||||
*/
|
/**
|
||||||
private class MapViewPointSetOverlay extends MapViewOverlay implements PointSetOverlay {
|
* PointSetOverlay for MapViewDrawing - Not currently implemented.
|
||||||
|
*
|
||||||
public MapViewPointSetOverlay() {
|
*/
|
||||||
super(new Layer[0], Color.BLACK);
|
private class MapViewPointSetOverlay extends MapViewOverlay implements PointSetOverlay {
|
||||||
}
|
|
||||||
|
private List<Point> points = new ArrayList<>();
|
||||||
@Override
|
private final Polygon polygon;
|
||||||
public void setWidth(int width) {
|
|
||||||
}
|
private List<Point> convexHull(List<Point> p) {
|
||||||
|
if (p.isEmpty()) {
|
||||||
@Override
|
return new ArrayList<>();
|
||||||
public void setWidthAndColor(int width, Color color) {
|
}
|
||||||
setWidth(width);
|
p.sort((p1, p2) -> Float.compare(p1.getLongitude(), p2.getLongitude()));
|
||||||
setColor(color);
|
List<Point> h = new ArrayList<>();
|
||||||
}
|
|
||||||
|
// lower hull
|
||||||
@Override
|
for (Point pt: p) {
|
||||||
public void addPoint(Point point) {
|
while (h.size() >= 2 && !ccw(h.get(h.size() - 2), h.get(h.size() - 1), pt)) {
|
||||||
}
|
h.remove(h.size() - 1);
|
||||||
|
}
|
||||||
@Override
|
h.add(pt);
|
||||||
public void addPoint(Point point, int width) {
|
}
|
||||||
setWidth(width);
|
|
||||||
addPoint(point);
|
// upper hull
|
||||||
}
|
int t = h.size() + 1;
|
||||||
|
for (int i = p.size() - 1; i >= 0; i--) {
|
||||||
@Override
|
Point pt = p.get(i);
|
||||||
public void addPoint(Point point, Color color) {
|
while (h.size() >= t && !ccw(h.get(h.size() - 2), h.get(h.size() - 1), pt)) {
|
||||||
setColor(color);
|
h.remove(h.size() - 1);
|
||||||
addPoint(point);
|
}
|
||||||
}
|
h.add(pt);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public void addPoint(Point point, int width, Color color) {
|
h.remove(h.size() - 1);
|
||||||
setWidth(width);
|
return h;
|
||||||
setColor(color);
|
}
|
||||||
addPoint(point);
|
|
||||||
}
|
// ccw returns true if the three points make a counter-clockwise turn
|
||||||
|
private boolean ccw(Point a, Point b, Point c) {
|
||||||
};
|
return ((b.getLongitude() - a.getLongitude())
|
||||||
|
* (c.getLatitude() - a.getLatitude())) > ((b.getLatitude() - a.getLatitude())
|
||||||
// Default path color.
|
* (c.getLongitude() - a.getLongitude()));
|
||||||
public static final Color DEFAULT_PATH_COLOR = new Color(66, 134, 244);
|
}
|
||||||
|
|
||||||
// Graphic factory.
|
public MapViewPointSetOverlay() {
|
||||||
private static final GraphicFactory GRAPHIC_FACTORY = AwtGraphicFactory.INSTANCE;
|
super(new Layer[] { new Polygon(GRAPHIC_FACTORY.createPaint(), null, GRAPHIC_FACTORY) },
|
||||||
|
Color.BLACK);
|
||||||
// Default tile size.
|
polygon = (Polygon) this.layers[0];
|
||||||
private static final int DEFAULT_TILE_SIZE = 512;
|
}
|
||||||
|
|
||||||
// List of listeners.
|
@Override
|
||||||
private ArrayList<DrawingClickListener> drawingClickListeners = new ArrayList<>();
|
public void setColor(Color color) {
|
||||||
|
super.setColor(color);
|
||||||
// Tile size
|
polygon.getPaintFill().setColor(GRAPHIC_FACTORY.createColor(100, color.getRed(),
|
||||||
private int tileSize;
|
color.getGreen(), color.getBlue()));
|
||||||
|
}
|
||||||
// Zoom controls
|
|
||||||
private MapZoomControls zoomControls;
|
@Override
|
||||||
|
public void setWidth(int width) {
|
||||||
public MapViewDrawing() {
|
}
|
||||||
super();
|
|
||||||
Parameters.NUMBER_OF_THREADS = 2;
|
@Override
|
||||||
Parameters.SQUARE_FRAME_BUFFER = false;
|
public void setWidthAndColor(int width, Color color) {
|
||||||
|
setWidth(width);
|
||||||
getMapScaleBar().setVisible(true);
|
setColor(color);
|
||||||
DisplayModel model = getModel().displayModel;
|
}
|
||||||
this.tileSize = DEFAULT_TILE_SIZE;
|
|
||||||
model.setFixedTileSize(this.tileSize);
|
@Override
|
||||||
|
public void addPoint(Point point) {
|
||||||
this.setZoomLevelMin((byte) 0);
|
points.add(point);
|
||||||
this.setZoomLevelMax((byte) 20);
|
this.points = convexHull(points);
|
||||||
|
polygon.setPoints(this.points.stream().map(MapViewDrawing.this::convertPoint)
|
||||||
// Try...
|
.collect(Collectors.toList()));
|
||||||
try {
|
polygon.requestRedraw();
|
||||||
this.zoomControls = new MapZoomControls(this, 0, 0, 20);
|
}
|
||||||
this.zoomControls.addZoomInListener(new ActionListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void addPoint(Point point, int width) {
|
||||||
getModel().mapViewPosition.zoomIn();
|
setWidth(width);
|
||||||
}
|
addPoint(point);
|
||||||
});
|
}
|
||||||
this.zoomControls.addZoomOutListener(new ActionListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void addPoint(Point point, Color color) {
|
||||||
getModel().mapViewPosition.zoomOut();
|
setColor(color);
|
||||||
}
|
addPoint(point);
|
||||||
});
|
}
|
||||||
}
|
|
||||||
catch (IOException e) {
|
@Override
|
||||||
e.printStackTrace();
|
public void addPoint(Point point, int width, Color color) {
|
||||||
}
|
setWidth(width);
|
||||||
}
|
setColor(color);
|
||||||
|
addPoint(point);
|
||||||
/*
|
}
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
};
|
||||||
* @see org.mapsforge.map.awt.view.MapView#paint(java.awt.Graphics)
|
|
||||||
*/
|
// Default path color.
|
||||||
@Override
|
public static final Color DEFAULT_PATH_COLOR = new Color(66, 134, 244);
|
||||||
public void paint(Graphics graphics) {
|
|
||||||
super.paint(graphics);
|
// Graphic factory.
|
||||||
if (this.zoomControls != null) {
|
private static final GraphicFactory GRAPHIC_FACTORY = AwtGraphicFactory.INSTANCE;
|
||||||
this.zoomControls.setZoomLevel(this.getModel().mapViewPosition.getZoomLevel());
|
|
||||||
this.zoomControls.draw((Graphics2D) graphics,
|
// Default tile size.
|
||||||
getWidth() - this.zoomControls.getWidth() - 20,
|
private static final int DEFAULT_TILE_SIZE = 512;
|
||||||
this.getHeight() - this.zoomControls.getHeight() - 10, this);
|
|
||||||
}
|
// List of listeners.
|
||||||
|
private ArrayList<DrawingClickListener> drawingClickListeners = new ArrayList<>();
|
||||||
}
|
|
||||||
|
// Tile size
|
||||||
/*
|
private int tileSize;
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
// Zoom controls
|
||||||
* @see org.insa.graphics.drawing.Drawing#clear()
|
private MapZoomControls zoomControls;
|
||||||
*/
|
|
||||||
@Override
|
public MapViewDrawing() {
|
||||||
public void clear() {
|
super();
|
||||||
getLayerManager().getLayers().clear();
|
Parameters.NUMBER_OF_THREADS = 2;
|
||||||
repaint();
|
Parameters.SQUARE_FRAME_BUFFER = false;
|
||||||
}
|
|
||||||
|
getMapScaleBar().setVisible(true);
|
||||||
/*
|
DisplayModel model = getModel().displayModel;
|
||||||
* (non-Javadoc)
|
this.tileSize = DEFAULT_TILE_SIZE;
|
||||||
*
|
model.setFixedTileSize(this.tileSize);
|
||||||
* @see org.insa.graphics.drawing.Drawing#clearOverlays()
|
|
||||||
*/
|
this.setZoomLevelMin((byte) 0);
|
||||||
@Override
|
this.setZoomLevelMax((byte) 20);
|
||||||
public void clearOverlays() {
|
|
||||||
Layers layers = getLayerManager().getLayers();
|
// Try...
|
||||||
for (Layer layer: layers) {
|
try {
|
||||||
if (layer instanceof PolylineAutoScaling || layer instanceof MarkerAutoScaling) {
|
this.zoomControls = new MapZoomControls(this, 0, 0, 20);
|
||||||
getLayerManager().getLayers().remove(layer, false);
|
this.zoomControls.addZoomInListener(new ActionListener() {
|
||||||
}
|
@Override
|
||||||
}
|
public void actionPerformed(ActionEvent e) {
|
||||||
repaint();
|
getModel().mapViewPosition.zoomIn();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
protected LatLong convertPoint(Point point) {
|
this.zoomControls.addZoomOutListener(new ActionListener() {
|
||||||
return new LatLong(point.getLatitude(), point.getLongitude());
|
@Override
|
||||||
}
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
getModel().mapViewPosition.zoomOut();
|
||||||
private TileRendererLayer createTileRendererLayer(TileCache tileCache,
|
}
|
||||||
MapDataStore mapDataStore, MapViewPosition mapViewPosition,
|
});
|
||||||
HillsRenderConfig hillsRenderConfig) {
|
}
|
||||||
TileRendererLayer tileRendererLayer = new TileRendererLayer(tileCache, mapDataStore,
|
catch (IOException e) {
|
||||||
mapViewPosition, false, true, false, GRAPHIC_FACTORY, hillsRenderConfig) {
|
e.printStackTrace();
|
||||||
@Override
|
}
|
||||||
public boolean onTap(LatLong tapLatLong, org.mapsforge.core.model.Point layerXY,
|
}
|
||||||
org.mapsforge.core.model.Point tapXY) {
|
|
||||||
if (zoomControls.contains(new java.awt.Point((int) tapXY.x, (int) tapXY.y))) {
|
/*
|
||||||
return false;
|
* (non-Javadoc)
|
||||||
}
|
*
|
||||||
Point pt = new Point((float) tapLatLong.getLongitude(),
|
* @see org.mapsforge.map.awt.view.MapView#paint(java.awt.Graphics)
|
||||||
(float) tapLatLong.getLatitude());
|
*/
|
||||||
for (DrawingClickListener listener: MapViewDrawing.this.drawingClickListeners) {
|
@Override
|
||||||
listener.mouseClicked(pt);
|
public void paint(Graphics graphics) {
|
||||||
}
|
super.paint(graphics);
|
||||||
return true;
|
if (this.zoomControls != null) {
|
||||||
}
|
this.zoomControls.setZoomLevel(this.getModel().mapViewPosition.getZoomLevel());
|
||||||
};
|
this.zoomControls.draw((Graphics2D) graphics,
|
||||||
tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.DEFAULT);
|
getWidth() - this.zoomControls.getWidth() - 20,
|
||||||
return tileRendererLayer;
|
this.getHeight() - this.zoomControls.getHeight() - 10, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
}
|
||||||
public void addDrawingClickListener(DrawingClickListener listener) {
|
|
||||||
this.drawingClickListeners.add(listener);
|
/*
|
||||||
}
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
@Override
|
* @see org.insa.graphics.drawing.Drawing#clear()
|
||||||
public void removeDrawingClickListener(DrawingClickListener listener) {
|
*/
|
||||||
this.drawingClickListeners.remove(listener);
|
@Override
|
||||||
}
|
public void clear() {
|
||||||
|
getLayerManager().getLayers().clear();
|
||||||
protected MarkerAutoScaling createMarker(Point point, Color outer, Color inner,
|
repaint();
|
||||||
AlphaMode mode) {
|
}
|
||||||
Image image = MarkerUtils.getMarkerForColor(outer, inner, mode);
|
|
||||||
return new MarkerAutoScaling(convertPoint(point), image);
|
/*
|
||||||
}
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
@Override
|
* @see org.insa.graphics.drawing.Drawing#clearOverlays()
|
||||||
public MarkerOverlay drawMarker(Point point, Color outer, Color inner, AlphaMode mode) {
|
*/
|
||||||
return new MapViewMarkerOverlay(createMarker(point, outer, inner, mode), outer, inner,
|
@Override
|
||||||
mode);
|
public void clearOverlays() {
|
||||||
}
|
Layers layers = getLayerManager().getLayers();
|
||||||
|
for (Layer layer: layers) {
|
||||||
@Override
|
if (layer instanceof PolylineAutoScaling || layer instanceof MarkerAutoScaling) {
|
||||||
public PointSetOverlay createPointSetOverlay() {
|
getLayerManager().getLayers().remove(layer, false);
|
||||||
return new MapViewPointSetOverlay();
|
}
|
||||||
}
|
}
|
||||||
|
repaint();
|
||||||
@Override
|
}
|
||||||
public PointSetOverlay createPointSetOverlay(int width, Color color) {
|
|
||||||
PointSetOverlay ps = new MapViewPointSetOverlay();
|
protected LatLong convertPoint(Point point) {
|
||||||
ps.setWidthAndColor(width, color);
|
return new LatLong(point.getLatitude(), point.getLongitude());
|
||||||
return ps;
|
}
|
||||||
}
|
|
||||||
|
private TileRendererLayer createTileRendererLayer(TileCache tileCache,
|
||||||
public void drawGraph(File file) {
|
MapDataStore mapDataStore, IMapViewPosition mapViewPosition,
|
||||||
|
HillsRenderConfig hillsRenderConfig) {
|
||||||
// Tile cache
|
TileRendererLayer tileRendererLayer = new TileRendererLayer(tileCache, mapDataStore,
|
||||||
TileCache tileCache = AwtUtil.createTileCache(tileSize,
|
mapViewPosition, false, true, false, GRAPHIC_FACTORY, hillsRenderConfig) {
|
||||||
getModel().frameBufferModel.getOverdrawFactor(), 1024,
|
@Override
|
||||||
new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()));
|
public boolean onTap(LatLong tapLatLong, org.mapsforge.core.model.Point layerXY,
|
||||||
|
org.mapsforge.core.model.Point tapXY) {
|
||||||
// Layers
|
if (zoomControls.contains(new java.awt.Point((int) tapXY.x, (int) tapXY.y))) {
|
||||||
Layers layers = getLayerManager().getLayers();
|
return false;
|
||||||
|
}
|
||||||
MapDataStore mapDataStore = new MapFile(file);
|
Point pt = new Point((float) tapLatLong.getLongitude(),
|
||||||
TileRendererLayer tileRendererLayer = createTileRendererLayer(tileCache, mapDataStore,
|
(float) tapLatLong.getLatitude());
|
||||||
getModel().mapViewPosition, null);
|
for (DrawingClickListener listener: MapViewDrawing.this.drawingClickListeners) {
|
||||||
layers.add(tileRendererLayer);
|
listener.mouseClicked(pt);
|
||||||
BoundingBox boundingBox = mapDataStore.boundingBox();
|
}
|
||||||
|
return true;
|
||||||
final Model model = getModel();
|
}
|
||||||
if (model.mapViewPosition.getZoomLevel() == 0
|
};
|
||||||
|| !boundingBox.contains(model.mapViewPosition.getCenter())) {
|
tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.DEFAULT);
|
||||||
byte zoomLevel = LatLongUtils.zoomForBounds(model.mapViewDimension.getDimension(),
|
return tileRendererLayer;
|
||||||
boundingBox, model.displayModel.getTileSize());
|
}
|
||||||
model.mapViewPosition
|
|
||||||
.setMapPosition(new MapPosition(boundingBox.getCenterPoint(), zoomLevel));
|
@Override
|
||||||
zoomControls.setZoomLevel(zoomLevel);
|
public void addDrawingClickListener(DrawingClickListener listener) {
|
||||||
}
|
this.drawingClickListeners.add(listener);
|
||||||
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
public void removeDrawingClickListener(DrawingClickListener listener) {
|
||||||
public void drawGraph(Graph graph, GraphPalette palette) {
|
this.drawingClickListeners.remove(listener);
|
||||||
throw new RuntimeException("Not implemented, use drawGraph(File).");
|
}
|
||||||
}
|
|
||||||
|
protected MarkerAutoScaling createMarker(Point point, Color outer, Color inner,
|
||||||
@Override
|
AlphaMode mode) {
|
||||||
public void drawGraph(Graph graph) {
|
Image image = MarkerUtils.getMarkerForColor(outer, inner, mode);
|
||||||
throw new RuntimeException("Not implemented, use drawGraph(File).");
|
return new MarkerAutoScaling(convertPoint(point), image);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PathOverlay drawPath(Path path, Color color, boolean markers) {
|
public MarkerOverlay drawMarker(Point point, Color outer, Color inner, AlphaMode mode) {
|
||||||
PolylineAutoScaling line = new PolylineAutoScaling(1, color);
|
return new MapViewMarkerOverlay(createMarker(point, outer, inner, mode), outer, inner,
|
||||||
ArrayList<Point> points = new ArrayList<>(path.getArcs().size() * 4);
|
mode);
|
||||||
for (Arc arc: path.getArcs()) {
|
}
|
||||||
points.addAll(arc.getPoints());
|
|
||||||
}
|
@Override
|
||||||
line.addAll(points);
|
public PointSetOverlay createPointSetOverlay() {
|
||||||
PathOverlay overlay = null;
|
return new MapViewPointSetOverlay();
|
||||||
if (markers) {
|
}
|
||||||
MarkerAutoScaling origin = createMarker(path.getOrigin().getPoint(), color, color,
|
|
||||||
AlphaMode.TRANSPARENT),
|
@Override
|
||||||
destination = createMarker(path.getDestination().getPoint(), color, color,
|
public PointSetOverlay createPointSetOverlay(int width, Color color) {
|
||||||
AlphaMode.TRANSPARENT);
|
PointSetOverlay ps = new MapViewPointSetOverlay();
|
||||||
overlay = new MapViewPathOverlay(line, origin, destination);
|
ps.setWidthAndColor(width, color);
|
||||||
}
|
return ps;
|
||||||
else {
|
}
|
||||||
overlay = new MapViewPathOverlay(line);
|
|
||||||
}
|
public void drawGraph(File file) {
|
||||||
return overlay;
|
|
||||||
}
|
// Tile cache
|
||||||
|
TileCache tileCache = AwtUtil.createTileCache(tileSize,
|
||||||
@Override
|
getModel().frameBufferModel.getOverdrawFactor(), 1024,
|
||||||
public PathOverlay drawPath(Path path, Color color) {
|
new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()));
|
||||||
return drawPath(path, color, true);
|
|
||||||
}
|
// Layers
|
||||||
|
Layers layers = getLayerManager().getLayers();
|
||||||
@Override
|
|
||||||
public PathOverlay drawPath(Path path) {
|
MapDataStore mapDataStore = new MapFile(file);
|
||||||
return drawPath(path, DEFAULT_PATH_COLOR, true);
|
TileRendererLayer tileRendererLayer = createTileRendererLayer(tileCache, mapDataStore,
|
||||||
}
|
getModel().mapViewPosition, null);
|
||||||
|
layers.add(tileRendererLayer);
|
||||||
@Override
|
BoundingBox boundingBox = mapDataStore.boundingBox();
|
||||||
public PathOverlay drawPath(Path path, boolean markers) {
|
|
||||||
return drawPath(path, DEFAULT_PATH_COLOR, markers);
|
final Model model = getModel();
|
||||||
}
|
if (model.mapViewPosition.getZoomLevel() == 0
|
||||||
|
|| !boundingBox.contains(model.mapViewPosition.getCenter())) {
|
||||||
}
|
byte zoomLevel = LatLongUtils.zoomForBounds(model.mapViewDimension.getDimension(),
|
||||||
|
boundingBox, model.displayModel.getTileSize());
|
||||||
|
model.mapViewPosition
|
||||||
|
.setMapPosition(new MapPosition(boundingBox.getCenterPoint(), zoomLevel));
|
||||||
|
zoomControls.setZoomLevel(zoomLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawGraph(Graph graph, GraphPalette palette) {
|
||||||
|
throw new RuntimeException("Not implemented, use drawGraph(File).");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawGraph(Graph graph) {
|
||||||
|
throw new RuntimeException("Not implemented, use drawGraph(File).");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathOverlay drawPath(Path path, Color color, boolean markers) {
|
||||||
|
PolylineAutoScaling line = new PolylineAutoScaling(1, color);
|
||||||
|
ArrayList<Point> points = new ArrayList<>(path.getArcs().size() * 4);
|
||||||
|
for (Arc arc: path.getArcs()) {
|
||||||
|
points.addAll(arc.getPoints());
|
||||||
|
}
|
||||||
|
line.addAll(points);
|
||||||
|
PathOverlay overlay = null;
|
||||||
|
if (markers) {
|
||||||
|
MarkerAutoScaling origin = createMarker(path.getOrigin().getPoint(), color, color,
|
||||||
|
AlphaMode.TRANSPARENT),
|
||||||
|
destination = createMarker(path.getDestination().getPoint(), color, color,
|
||||||
|
AlphaMode.TRANSPARENT);
|
||||||
|
overlay = new MapViewPathOverlay(line, origin, destination);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
overlay = new MapViewPathOverlay(line);
|
||||||
|
}
|
||||||
|
return overlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathOverlay drawPath(Path path, Color color) {
|
||||||
|
return drawPath(path, color, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathOverlay drawPath(Path path) {
|
||||||
|
return drawPath(path, DEFAULT_PATH_COLOR, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathOverlay drawPath(Path path, boolean markers) {
|
||||||
|
return drawPath(path, DEFAULT_PATH_COLOR, markers);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.components;
|
package org.insa.graphs.gui.drawing.components;
|
||||||
|
|
||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.components;
|
package org.insa.graphs.gui.drawing.components;
|
||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
@ -1,6 +1,6 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.model.Point;
|
||||||
|
|
||||||
public interface MarkerOverlay extends Overlay {
|
public interface MarkerOverlay extends Overlay {
|
||||||
|
|
@ -1,97 +1,97 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
|
|
||||||
import org.insa.graphics.drawing.Drawing.AlphaMode;
|
import org.insa.graphs.gui.drawing.Drawing.AlphaMode;
|
||||||
|
|
||||||
public class MarkerUtils {
|
public class MarkerUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an image to represent a marker using the given color for the outer and
|
* Create an image to represent a marker using the given color for the outer and
|
||||||
* inner part, and the given mode for the inner part.
|
* inner part, and the given mode for the inner part.
|
||||||
*
|
*
|
||||||
* @param outer Outer color of the marker.
|
* @param outer Outer color of the marker.
|
||||||
* @param inner Inner color of the marker.
|
* @param inner Inner color of the marker.
|
||||||
* @param mode Mode to use to fill the inner part of the marker.
|
* @param mode Mode to use to fill the inner part of the marker.
|
||||||
*
|
*
|
||||||
* @return An image representing a marker.
|
* @return An image representing a marker.
|
||||||
*/
|
*/
|
||||||
public static Image getMarkerForColor(Color outer, Color inner, AlphaMode mode) {
|
public static Image getMarkerForColor(Color outer, Color inner, AlphaMode mode) {
|
||||||
// create image
|
// create image
|
||||||
int[][] mask = readMarkerMask();
|
int[][] mask = readMarkerMask();
|
||||||
BufferedImage image = new BufferedImage(mask[0].length, mask.length,
|
BufferedImage image = new BufferedImage(mask[0].length, mask.length,
|
||||||
BufferedImage.TYPE_4BYTE_ABGR);
|
BufferedImage.TYPE_4BYTE_ABGR);
|
||||||
|
|
||||||
// Color[] map = getColorMapping(color);
|
// Color[] map = getColorMapping(color);
|
||||||
int outerRGB = outer.getRGB() & 0x00ffffff;
|
int outerRGB = outer.getRGB() & 0x00ffffff;
|
||||||
for (int i = 0; i < image.getHeight(); ++i) {
|
for (int i = 0; i < image.getHeight(); ++i) {
|
||||||
for (int j = 0; j < image.getWidth(); ++j) {
|
for (int j = 0; j < image.getWidth(); ++j) {
|
||||||
|
|
||||||
// If we are in the "inner" part of the marker...
|
// If we are in the "inner" part of the marker...
|
||||||
if (i >= MIN_Y_CENTER && i < MAX_Y_CENTER && j >= MIN_X_CENTER && j < MAX_X_CENTER
|
if (i >= MIN_Y_CENTER && i < MAX_Y_CENTER && j >= MIN_X_CENTER && j < MAX_X_CENTER
|
||||||
&& mask[i][j] != MAXIMUM_INNER_MASK_VALUE) {
|
&& mask[i][j] != MAXIMUM_INNER_MASK_VALUE) {
|
||||||
// Don't ask... https://stackoverflow.com/a/29321264/2666289
|
// Don't ask... https://stackoverflow.com/a/29321264/2666289
|
||||||
// Basically, this compute a "middle" color between outer and inner depending on
|
// Basically, this compute a "middle" color between outer and inner depending on
|
||||||
// the current mask value.
|
// the current mask value.
|
||||||
double t = 1 - (mask[i][j] - MINIMUM_INNER_MASK_VALUE)
|
double t = 1 - (mask[i][j] - MINIMUM_INNER_MASK_VALUE)
|
||||||
/ (double) (MAXIMUM_INNER_MASK_VALUE - MINIMUM_INNER_MASK_VALUE);
|
/ (double) (MAXIMUM_INNER_MASK_VALUE - MINIMUM_INNER_MASK_VALUE);
|
||||||
int r = (int) Math.sqrt((1 - t) * outer.getRed() * outer.getRed()
|
int r = (int) Math.sqrt((1 - t) * outer.getRed() * outer.getRed()
|
||||||
+ t * inner.getRed() * inner.getRed());
|
+ t * inner.getRed() * inner.getRed());
|
||||||
int g = (int) Math.sqrt((1 - t) * outer.getGreen() * outer.getGreen()
|
int g = (int) Math.sqrt((1 - t) * outer.getGreen() * outer.getGreen()
|
||||||
+ t * inner.getGreen() * inner.getGreen());
|
+ t * inner.getGreen() * inner.getGreen());
|
||||||
int b = (int) Math.sqrt((1 - t) * outer.getBlue() * outer.getBlue()
|
int b = (int) Math.sqrt((1 - t) * outer.getBlue() * outer.getBlue()
|
||||||
+ t * inner.getBlue() * inner.getBlue());
|
+ t * inner.getBlue() * inner.getBlue());
|
||||||
int a = mode == AlphaMode.OPAQUE ? MAXIMUM_INNER_MASK_VALUE : mask[i][j];
|
int a = mode == AlphaMode.OPAQUE ? MAXIMUM_INNER_MASK_VALUE : mask[i][j];
|
||||||
image.setRGB(j, i, (a << 24) | (r << 16) | (g << 8) | b);
|
image.setRGB(j, i, (a << 24) | (r << 16) | (g << 8) | b);
|
||||||
}
|
}
|
||||||
// Otherwize, just fill with the outer color and set the alpha value properly.
|
// Otherwize, just fill with the outer color and set the alpha value properly.
|
||||||
else {
|
else {
|
||||||
image.setRGB(j, i, outerRGB | (mask[i][j] << 24));
|
image.setRGB(j, i, outerRGB | (mask[i][j] << 24));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mask cache
|
// Mask cache
|
||||||
private static int[][] MASK_CACHE = null;
|
private static int[][] MASK_CACHE = null;
|
||||||
|
|
||||||
// Hand-made... These defines the "center" of the marker, that can be filled
|
// Hand-made... These defines the "center" of the marker, that can be filled
|
||||||
// with a different color.
|
// with a different color.
|
||||||
private static final int MIN_X_CENTER = 40, MAX_X_CENTER = 101, MIN_Y_CENTER = 40,
|
private static final int MIN_X_CENTER = 40, MAX_X_CENTER = 101, MIN_Y_CENTER = 40,
|
||||||
MAX_Y_CENTER = 100;
|
MAX_Y_CENTER = 100;
|
||||||
private static final int MINIMUM_INNER_MASK_VALUE = 116, MAXIMUM_INNER_MASK_VALUE = 249;
|
private static final int MINIMUM_INNER_MASK_VALUE = 116, MAXIMUM_INNER_MASK_VALUE = 249;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Retrieve the mask from the mask file or from the cache.
|
* @return Retrieve the mask from the mask file or from the cache.
|
||||||
*/
|
*/
|
||||||
private static int[][] readMarkerMask() {
|
private static int[][] readMarkerMask() {
|
||||||
if (MASK_CACHE == null) {
|
if (MASK_CACHE == null) {
|
||||||
try {
|
try {
|
||||||
DataInputStream dis = new DataInputStream(
|
DataInputStream dis = new DataInputStream(
|
||||||
MarkerUtils.class.getResourceAsStream("/marker_mask.bin"));
|
MarkerUtils.class.getResourceAsStream("/marker_mask.bin"));
|
||||||
|
|
||||||
int nrows = dis.readInt();
|
int nrows = dis.readInt();
|
||||||
int ncols = dis.readInt();
|
int ncols = dis.readInt();
|
||||||
|
|
||||||
MASK_CACHE = new int[nrows][ncols];
|
MASK_CACHE = new int[nrows][ncols];
|
||||||
for (int i = 0; i < nrows; ++i) {
|
for (int i = 0; i < nrows; ++i) {
|
||||||
for (int j = 0; j < ncols; ++j) {
|
for (int j = 0; j < ncols; ++j) {
|
||||||
MASK_CACHE[i][j] = dis.readUnsignedByte();
|
MASK_CACHE[i][j] = dis.readUnsignedByte();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dis.close();
|
dis.close();
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
MASK_CACHE = null;
|
MASK_CACHE = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return MASK_CACHE;
|
return MASK_CACHE;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
public interface PathOverlay extends Overlay {
|
public interface PathOverlay extends Overlay {
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.model.Point;
|
||||||
|
|
||||||
public interface PointSetOverlay extends Overlay {
|
public interface PointSetOverlay extends Overlay {
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
package org.insa.graphics.drawing.overlays;
|
package org.insa.graphs.gui.drawing.overlays;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import org.insa.graph.Point;
|
import org.insa.graphs.model.Point;
|
||||||
import org.mapsforge.core.graphics.Canvas;
|
import org.mapsforge.core.graphics.Canvas;
|
||||||
import org.mapsforge.core.graphics.GraphicFactory;
|
import org.mapsforge.core.graphics.GraphicFactory;
|
||||||
import org.mapsforge.core.graphics.Style;
|
import org.mapsforge.core.graphics.Style;
|
@ -1,10 +1,11 @@
|
|||||||
package org.insa.algo.shortestpath;
|
package org.insa.graphs.gui.observers;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.algorithm.shortestpath.ShortestPathObserver;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graphics.drawing.overlays.PointSetOverlay;
|
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
||||||
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class ShortestPathGraphicObserver implements ShortestPathObserver {
|
public class ShortestPathGraphicObserver implements ShortestPathObserver {
|
||||||
|
|
@ -1,15 +1,17 @@
|
|||||||
package org.insa.algo.weakconnectivity;
|
package org.insa.graphs.gui.observers;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.insa.graph.Node;
|
import org.insa.graphs.algorithm.weakconnectivity.WeaklyConnectedComponentObserver;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graphics.drawing.overlays.PointSetOverlay;
|
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
||||||
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentGraphicObserver implements WeaklyConnectedComponentObserver {
|
public class WeaklyConnectedComponentGraphicObserver implements WeaklyConnectedComponentObserver {
|
||||||
|
|
||||||
private static final Color[] COLORS = { Color.BLUE, Color.ORANGE, Color.GREEN, Color.YELLOW, Color.RED };
|
private static final Color[] COLORS = { Color.BLUE, Color.ORANGE, Color.GREEN, Color.YELLOW,
|
||||||
|
Color.RED };
|
||||||
|
|
||||||
// Drawing + Graph drawing
|
// Drawing + Graph drawing
|
||||||
private PointSetOverlay grPoints;
|
private PointSetOverlay grPoints;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.base;
|
package org.insa.graphs.gui.simple;
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
@ -9,13 +9,13 @@ import java.io.FileInputStream;
|
|||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import org.insa.graph.Graph;
|
import org.insa.graphs.gui.drawing.Drawing;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graphs.gui.drawing.components.BasicDrawing;
|
||||||
import org.insa.graph.io.BinaryGraphReader;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graph.io.GraphReader;
|
import org.insa.graphs.model.Path;
|
||||||
import org.insa.graph.io.PathReader;
|
import org.insa.graphs.model.io.BinaryGraphReader;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphs.model.io.GraphReader;
|
||||||
import org.insa.graphics.drawing.components.BasicDrawing;
|
import org.insa.graphs.model.io.PathReader;
|
||||||
|
|
||||||
public class Launch {
|
public class Launch {
|
||||||
|
|
||||||
@ -46,29 +46,28 @@ public class Launch {
|
|||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
// Visit these directory to see the list of available files on Commetud.
|
// Visit these directory to see the list of available files on Commetud.
|
||||||
String mapName = "/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/insa.mapgr";
|
final String mapName = "/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/insa.mapgr";
|
||||||
String pathName = "/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Paths/path_fr31insa_rangueil_r2.path";
|
final String pathName = "/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Paths/path_fr31insa_rangueil_r2.path";
|
||||||
|
|
||||||
// Create a graph reader.
|
// Create a graph reader.
|
||||||
GraphReader reader = new BinaryGraphReader(
|
final GraphReader reader = new BinaryGraphReader(
|
||||||
new DataInputStream(new BufferedInputStream(new FileInputStream(mapName))));
|
new DataInputStream(new BufferedInputStream(new FileInputStream(mapName))));
|
||||||
|
|
||||||
// TODO: Read the graph.
|
// TODO: Read the graph.
|
||||||
Graph graph = null;
|
final Graph graph = null;
|
||||||
|
|
||||||
// Create the drawing:
|
// Create the drawing:
|
||||||
Drawing drawing = createDrawing();
|
final Drawing drawing = createDrawing();
|
||||||
|
|
||||||
// TODO: Draw the graph on the drawing.
|
// TODO: Draw the graph on the drawing.
|
||||||
|
|
||||||
// TODO: Create a PathReader.
|
// TODO: Create a PathReader.
|
||||||
PathReader pathReader = null;
|
final PathReader pathReader = null;
|
||||||
|
|
||||||
// TODO: Read the path.
|
// TODO: Read the path.
|
||||||
Path path = null;
|
final Path path = null;
|
||||||
|
|
||||||
// TODO: Draw the path.
|
// TODO: Draw the path.
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.utils;
|
package org.insa.graphs.gui.utils;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graphics.utils;
|
package org.insa.graphs.gui.utils;
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
14
be-graphes-model/pom.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<project
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
<artifactId>be-graphes-all</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>be-graphes-model</artifactId>
|
||||||
|
<name>be-graphes-model</name>
|
||||||
|
</project>
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing a point (position) on Earth.
|
* Class representing a point (position) on Earth.
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph;
|
package org.insa.graphs.model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
@ -1,4 +1,4 @@
|
|||||||
package org.insa.graph.io;
|
package org.insa.graphs.model.io;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -21,4 +21,13 @@ public class BadFormatException extends IOException {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new format exception with the given message.
|
||||||
|
*
|
||||||
|
* @param message Message for the exception.
|
||||||
|
*/
|
||||||
|
public BadFormatException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|