Browse Source

Update javadoc, clean Arc implementation.

Mikael Capelle 6 years ago
parent
commit
04bddb0d34

+ 5
- 0
src/main/org/insa/graph/Arc.java View File

@@ -7,6 +7,11 @@ import java.util.List;
7 7
  * class to allow us to represent two-ways roads in a memory efficient manner
8 8
  * (without having to duplicate attributes).
9 9
  * 
10
+ * Arc should never be created manually but always using the
11
+ * {@link Node#linkNodes(Node, Node, int, RoadInformation, java.util.ArrayList)}
12
+ * method to ensure proper instantiation of the {@link ArcForward} and
13
+ * {@link ArcBackward} classes.
14
+ * 
10 15
  * @see ArcForward
11 16
  * @see ArcBackward
12 17
  *

+ 3
- 3
src/main/org/insa/graph/ArcBackward.java View File

@@ -10,7 +10,7 @@ import java.util.List;
10 10
  * the original arc.
11 11
  *
12 12
  */
13
-public class ArcBackward implements Arc {
13
+class ArcBackward implements Arc {
14 14
 
15 15
     // Original arc
16 16
     private final ArcForward originalArc;
@@ -19,9 +19,9 @@ public class ArcBackward implements Arc {
19 19
      * Create a new backward arc which corresponds to the reverse arc of the given
20 20
      * arc.
21 21
      * 
22
-     * @param originalArc
22
+     * @param originalArc Original forwarc arc corresponding to this backward arc.
23 23
      */
24
-    public ArcBackward(ArcForward originalArc) {
24
+    protected ArcBackward(ArcForward originalArc) {
25 25
         this.originalArc = originalArc;
26 26
         this.originalArc.getDestination().addSuccessor(this);
27 27
     }

+ 11
- 21
src/main/org/insa/graph/ArcForward.java View File

@@ -24,7 +24,7 @@ public class ArcForward implements Arc {
24 24
     private final ArrayList<Point> points;
25 25
 
26 26
     /**
27
-     * Create a new arc and automatically link it with the given origin.
27
+     * Create a new ArcForward with the given attributes.
28 28
      * 
29 29
      * @param origin Origin of this arc.
30 30
      * @param dest Destination of this arc.
@@ -32,54 +32,44 @@ public class ArcForward implements Arc {
32 32
      * @param roadInformation Road information for this arc.
33 33
      * @param points Points representing this arc.
34 34
      */
35
-    public ArcForward(Node origin, Node dest, int length, RoadInformation roadInformation,
35
+    protected ArcForward(Node origin, Node dest, int length, RoadInformation roadInformation,
36 36
             ArrayList<Point> points) {
37 37
         this.origin = origin;
38 38
         this.destination = dest;
39 39
         this.length = length;
40 40
         this.info = roadInformation;
41 41
         this.points = points;
42
-        origin.addSuccessor(this);
43 42
     }
44 43
 
45
-    /**
46
-     * {@inheritDoc}
47
-     */
44
+    @Override
48 45
     public Node getOrigin() {
49 46
         return origin;
50 47
     }
51 48
 
52
-    /**
53
-     * {@inheritDoc}
54
-     */
49
+    @Override
55 50
     public Node getDestination() {
56 51
         return destination;
57 52
     }
58 53
 
59
-    /**
60
-     * {@inheritDoc}
61
-     */
54
+    @Override
55
+
62 56
     public int getLength() {
63 57
         return length;
64 58
     }
65 59
 
66
-    /**
67
-     * {@inheritDoc}
68
-     */
60
+    @Override
61
+
69 62
     public double getMinimumTravelTime() {
70 63
         return getLength() * 3600.0 / (info.getMaximumSpeed() * 1000.0);
71 64
     }
72 65
 
73
-    /**
74
-     * {@inheritDoc}
75
-     */
66
+    @Override
67
+
76 68
     public RoadInformation getRoadInformation() {
77 69
         return info;
78 70
     }
79 71
 
80
-    /**
81
-     * {@inheritDoc}
82
-     */
72
+    @Override
83 73
     public List<Point> getPoints() {
84 74
         return Collections.unmodifiableList(points);
85 75
     }

+ 23
- 12
src/main/org/insa/graph/Graph.java View File

@@ -3,6 +3,13 @@ package org.insa.graph;
3 3
 import java.util.Collections;
4 4
 import java.util.List;
5 5
 
6
+/**
7
+ * Main graph class.
8
+ * 
9
+ * This class acts as a object-oriented adjacency list for a graph, i.e. it
10
+ * holds a list of nodes and each node holds a list of its successors.
11
+ *
12
+ */
6 13
 public class Graph {
7 14
 
8 15
     // Map identifier.
@@ -15,35 +22,39 @@ public class Graph {
15 22
     private final List<Node> nodes;
16 23
 
17 24
     // Graph information of this graph.
18
-    private final GraphInformation graphInfo;
25
+    private final GraphStatistics graphStatistics;
19 26
 
20 27
     /**
21
-     * @param mapId ID of this graph.
22
-     * @param list List of nodes for this graph.
28
+     * Create a new graph with the given ID, name, nodes and information.
29
+     * 
30
+     * @param mapId ID of the map corresponding to this graph.
31
+     * @param mapName Name of the map corresponding to this graph.
32
+     * @param nodes List of nodes for this graph.
33
+     * @param graphStatistics Information for this graph.
23 34
      */
24
-    public Graph(String mapId, String mapName, List<Node> list, GraphInformation graphInformation) {
35
+    public Graph(String mapId, String mapName, List<Node> nodes, GraphStatistics graphStatistics) {
25 36
         this.mapId = mapId;
26 37
         this.mapName = mapName;
27
-        this.nodes = list;
28
-        this.graphInfo = graphInformation;
38
+        this.nodes = nodes;
39
+        this.graphStatistics = graphStatistics;
29 40
     }
30 41
 
31 42
     /**
32
-     * @return GraphInformation of this graph.
43
+     * @return The GraphStatistics instance associated with this graph.
33 44
      */
34
-    public GraphInformation getGraphInformation() {
35
-        return this.graphInfo;
45
+    public GraphStatistics getGraphInformation() {
46
+        return this.graphStatistics;
36 47
     }
37 48
 
38 49
     /**
39
-     * @return Immutable list of nodes of this graph.
50
+     * @return Immutable view of the list of nodes of this graph.
40 51
      */
41 52
     public List<Node> getNodes() {
42 53
         return Collections.unmodifiableList(nodes);
43 54
     }
44 55
 
45 56
     /**
46
-     * @return Map ID of this graph.
57
+     * @return ID of the map associated with this graph.
47 58
      */
48 59
     public String getMapId() {
49 60
         return mapId;
@@ -57,7 +68,7 @@ public class Graph {
57 68
     }
58 69
 
59 70
     /**
60
-     * @return Return the transpose graph of this graph.
71
+     * @return Transpose graph of this graph.
61 72
      */
62 73
     public Graph transpose() {
63 74
         // TODO:

+ 0
- 39
src/main/org/insa/graph/GraphInformation.java View File

@@ -1,39 +0,0 @@
1
-package org.insa.graph;
2
-
3
-/**
4
- * Utility class that stores some information for a graph that are no easy to
5
- * access quickly.
6
- *
7
- */
8
-public class GraphInformation {
9
-
10
-    // Maximum speed on this graph (in kmph).
11
-    private final int maximumSpeed;
12
-
13
-    // Maximum length of any arc on this graph.
14
-    private final int maximumLength;
15
-
16
-    /**
17
-     * @param maximumSpeed
18
-     * @param maximumLength
19
-     */
20
-    public GraphInformation(int maximumSpeed, int maximumLength) {
21
-        this.maximumLength = maximumLength;
22
-        this.maximumSpeed = maximumSpeed;
23
-    }
24
-
25
-    /**
26
-     * @return Maximum speed of any arc in the graph.
27
-     */
28
-    public int getMaximumSpeed() {
29
-        return this.maximumSpeed;
30
-    }
31
-
32
-    /**
33
-     * @return Maximum length of any arc in the graph.
34
-     */
35
-    public int getMaximumLength() {
36
-        return this.maximumLength;
37
-    }
38
-
39
-}

+ 46
- 0
src/main/org/insa/graph/GraphStatistics.java View File

@@ -0,0 +1,46 @@
1
+package org.insa.graph;
2
+
3
+/**
4
+ * Utility class that stores some statistics of graphs that are not easy to
5
+ * access.
6
+ * 
7
+ * This class is used to provide O(1) access to information in graph that do not
8
+ * change, and that usually require O(n) to compute.
9
+ *
10
+ */
11
+public class GraphStatistics {
12
+
13
+    // Maximum speed on this graph (in kmph).
14
+    private final int maximumSpeed;
15
+
16
+    // Maximum length of any arc on this graph.
17
+    private final int maximumLength;
18
+
19
+    /**
20
+     * Create a new GraphStatistics instance with the given value.
21
+     * 
22
+     * @param maximumSpeed Maximum speed of any road of the graph. A value of 0 may
23
+     * be used to indicate that this graph has no maximum limitation.
24
+     * @param maximumLength Maximum length of any arc of the graph.
25
+     */
26
+    public GraphStatistics(int maximumSpeed, int maximumLength) {
27
+        this.maximumLength = maximumLength;
28
+        this.maximumSpeed = maximumSpeed;
29
+    }
30
+
31
+    /**
32
+     * @return Maximum speed of any arc in the graph, or 0 if some road have no
33
+     * speed limitations.
34
+     */
35
+    public int getMaximumSpeed() {
36
+        return this.maximumSpeed;
37
+    }
38
+
39
+    /**
40
+     * @return Maximum length of any arc in the graph.
41
+     */
42
+    public int getMaximumLength() {
43
+        return this.maximumLength;
44
+    }
45
+
46
+}

+ 45
- 12
src/main/org/insa/graph/Node.java View File

@@ -4,8 +4,43 @@ import java.util.ArrayList;
4 4
 import java.util.Collections;
5 5
 import java.util.List;
6 6
 
7
+/**
8
+ * Class representing a Node in a {@link Graph}.
9
+ * 
10
+ * This class holds information regarding nodes in the graph together with the
11
+ * successors associated to the nodes.
12
+ * 
13
+ * Nodes are comparable based on their ID.
14
+ *
15
+ */
7 16
 public class Node implements Comparable<Node> {
8 17
 
18
+    /**
19
+     * Link the two given nodes with one or two arcs (depending on roadInformation),
20
+     * with the given attributes.
21
+     * 
22
+     * If `roadInformation.isOneWay()` is true, only a forward arc is created
23
+     * (origin to destination) and added to origin. Otherwise, a corresponding
24
+     * backward arc is created and add to destination.
25
+     * 
26
+     * @param origin Origin of the arc.
27
+     * @param destination Destination of the arc.
28
+     * @param length Length of the arc.
29
+     * @param roadInformation Information corresponding to the arc.
30
+     * @param points Points for the arc.
31
+     * 
32
+     * @return The newly created forward arc (origin to destination).
33
+     */
34
+    public static Arc linkNodes(Node origin, Node destination, int length,
35
+            RoadInformation roadInformation, ArrayList<Point> points) {
36
+        ArcForward arc = new ArcForward(origin, destination, length, roadInformation, points);
37
+        origin.addSuccessor(arc);
38
+        if (!roadInformation.isOneWay()) {
39
+            destination.addSuccessor(new ArcBackward(arc));
40
+        }
41
+        return arc;
42
+    }
43
+
9 44
     // ID of the node.
10 45
     private final int id;
11 46
 
@@ -16,10 +51,11 @@ public class Node implements Comparable<Node> {
16 51
     private final ArrayList<Arc> successors;
17 52
 
18 53
     /**
19
-     * Create a new Node corresponding to the given Point with an empty list of
20
-     * successors.
54
+     * Create a new Node with the given ID corresponding to the given Point with an
55
+     * empty list of successors.
21 56
      * 
22
-     * @param point
57
+     * @param id ID of the node.
58
+     * @param point Position of the node.
23 59
      */
24 60
     public Node(int id, Point point) {
25 61
         this.id = id;
@@ -44,24 +80,19 @@ public class Node implements Comparable<Node> {
44 80
     }
45 81
 
46 82
     /**
47
-     * @return List of successors of this node.
83
+     * @return Immutable view of the list of successors of this node.
48 84
      */
49 85
     public List<Arc> getSuccessors() {
50 86
         return Collections.unmodifiableList(successors);
51 87
     }
52 88
 
53 89
     /**
54
-     * @return Point of this node.
90
+     * @return Location of this node.
55 91
      */
56 92
     public Point getPoint() {
57 93
         return point;
58 94
     }
59 95
 
60
-    /*
61
-     * (non-Javadoc)
62
-     * 
63
-     * @see java.lang.Object#equals(java.lang.Object)
64
-     */
65 96
     @Override
66 97
     public boolean equals(Object other) {
67 98
         if (other instanceof Node) {
@@ -70,8 +101,10 @@ public class Node implements Comparable<Node> {
70 101
         return false;
71 102
     }
72 103
 
73
-    /*
74
-     * (non-Javadoc)
104
+    /**
105
+     * Compare the ID of this node with the ID of the given node.
106
+     * 
107
+     * @param other Node to compare this node with.
75 108
      * 
76 109
      * @see java.lang.Comparable#compareTo(java.lang.Object)
77 110
      */

+ 12
- 13
src/main/org/insa/graph/Point.java View File

@@ -1,20 +1,23 @@
1 1
 package org.insa.graph;
2 2
 
3 3
 /**
4
- * Class representing a point on Earth.
4
+ * Class representing a point (position) on Earth.
5 5
  *
6 6
  */
7 7
 public final class Point {
8 8
 
9
-    // Earth radius, in meters;
10
-    private static final double EARTH_RADIUS = 6378137.0;
9
+    /**
10
+     * Approximated Earth radius (in meters).
11
+     */
12
+    public static final double EARTH_RADIUS = 6378137.0;
11 13
 
12 14
     /**
13 15
      * Compute the distance in meters between the two given points.
14 16
      * 
15
-     * @param p1, p2
17
+     * @param p1 First point.
18
+     * @param p2 second point.
16 19
      * 
17
-     * @return Distance between the two given points, in meters.
20
+     * @return Distance between the two given points (in meters).
18 21
      */
19 22
     public static double distance(Point p1, Point p2) {
20 23
         double sinLat = Math.sin(Math.toRadians(p1.getLatitude()))
@@ -29,9 +32,10 @@ public final class Point {
29 32
     private final float longitude, latitude;
30 33
 
31 34
     /**
35
+     * Create a new point corresponding to the given (longitude, latitude) position.
32 36
      * 
33
-     * @param longitude Longitude of the point, in degrees.
34
-     * @param latitude Latitude of the point, in degrees.
37
+     * @param longitude Longitude of the point (in degrees).
38
+     * @param latitude Latitude of the point (in degrees).
35 39
      */
36 40
     public Point(float longitude, float latitude) {
37 41
         this.longitude = longitude;
@@ -55,7 +59,7 @@ public final class Point {
55 59
     /**
56 60
      * Compute the distance from this point to the given point
57 61
      * 
58
-     * @param target Target point.
62
+     * @param target Target point to compute distance to.
59 63
      * 
60 64
      * @return Distance between this point and the target point, in meters.
61 65
      */
@@ -63,11 +67,6 @@ public final class Point {
63 67
         return distance(this, target);
64 68
     }
65 69
 
66
-    /*
67
-     * (non-Javadoc)
68
-     * 
69
-     * @see java.lang.Object#toString()
70
-     */
71 70
     @Override
72 71
     public String toString() {
73 72
         return String.format("Point(%f, %f)", getLongitude(), getLatitude());

+ 16
- 7
src/main/org/insa/graph/RoadInformation.java View File

@@ -3,6 +3,9 @@ package org.insa.graph;
3 3
 /**
4 4
  * Class containing information for road that may be shared by multiple arcs.
5 5
  * 
6
+ * Sharing information between arcs reduces memory footprints of the program - A
7
+ * long road is often split into multiple arcs at each intersection.
8
+ * 
6 9
  */
7 10
 public class RoadInformation {
8 11
 
@@ -45,6 +48,16 @@ public class RoadInformation {
45 48
     // Name of the road.
46 49
     private final String name;
47 50
 
51
+    /**
52
+     * Create a new RoadInformation instance containing the given parameters.
53
+     * 
54
+     * @param roadType Type of the road (see {@link RoadType}).
55
+     * @param access Access restrictions for the road (see
56
+     * {@link AccessRestrictions}).
57
+     * @param isOneWay true if this road is a one way road, false otherwise.
58
+     * @param maxSpeed Maximum speed for the road (in kilometers-per-hour).
59
+     * @param name Name of the road.
60
+     */
48 61
     public RoadInformation(RoadType roadType, AccessRestrictions access, boolean isOneWay,
49 62
             int maxSpeed, String name) {
50 63
         this.type = roadType;
@@ -55,7 +68,7 @@ public class RoadInformation {
55 68
     }
56 69
 
57 70
     /**
58
-     * @return true if this is a private road.
71
+     * @return Access restrictions for this road.
59 72
      */
60 73
     public AccessRestrictions getAccessRestrictions() {
61 74
         return this.access;
@@ -69,14 +82,14 @@ public class RoadInformation {
69 82
     }
70 83
 
71 84
     /**
72
-     * @return true if this is a one-way road.
85
+     * @return true if the road is a one-way road.
73 86
      */
74 87
     public boolean isOneWay() {
75 88
         return oneway;
76 89
     }
77 90
 
78 91
     /**
79
-     * @return Maximum speed for this road (in kmph).
92
+     * @return Maximum speed for this road (in kilometers-per-hour).
80 93
      */
81 94
     public int getMaximumSpeed() {
82 95
         return maxSpeed;
@@ -89,10 +102,6 @@ public class RoadInformation {
89 102
         return name;
90 103
     }
91 104
 
92
-    /*
93
-     * (non-Javadoc)
94
-     * @see java.lang.Object#toString()
95
-     */
96 105
     @Override
97 106
     public String toString() {
98 107
         String typeAsString = "road";

+ 6
- 16
src/main/org/insa/graph/io/BinaryGraphReaderInsa2018.java View File

@@ -8,10 +8,9 @@ import java.util.EnumMap;
8 8
 import org.insa.graph.AccessRestrictions;
9 9
 import org.insa.graph.AccessRestrictions.AccessMode;
10 10
 import org.insa.graph.AccessRestrictions.AccessRestriction;
11
-import org.insa.graph.ArcBackward;
12
-import org.insa.graph.ArcForward;
11
+import org.insa.graph.Arc;
13 12
 import org.insa.graph.Graph;
14
-import org.insa.graph.GraphInformation;
13
+import org.insa.graph.GraphStatistics;
15 14
 import org.insa.graph.Node;
16 15
 import org.insa.graph.Point;
17 16
 import org.insa.graph.RoadInformation;
@@ -41,7 +40,7 @@ public class BinaryGraphReaderInsa2018 extends BinaryReader implements GraphRead
41 40
         // the order correspond to the 4 bits value (i.e. FORBIDDEN is 0 or PRIVATE is
42 41
         // 2) - UKNOWN is not included because value above 6 (FORESTRY) are all
43 42
         // considered unknown.
44
-        final AccessRestriction[] allRestrictions = new AccessRestriction[] {
43
+        final AccessRestriction[] allRestrictions = new AccessRestriction[]{
45 44
                 AccessRestriction.FORBIDDEN, AccessRestriction.ALLOWED, AccessRestriction.PRIVATE,
46 45
                 AccessRestriction.DESTINATION, AccessRestriction.DELIVERY,
47 46
                 AccessRestriction.CUSTOMERS, AccessRestriction.FORESTRY };
@@ -49,7 +48,7 @@ public class BinaryGraphReaderInsa2018 extends BinaryReader implements GraphRead
49 48
         // The order of values inside this array is VERY IMPORTANT: The order is such
50 49
         // that each 4-bits group of the long value is processed in the correct order,
51 50
         // i.e. FOOT is processed first (4 lowest bits), and so on.
52
-        final AccessMode[] allModes = new AccessMode[] { AccessMode.FOOT, null, AccessMode.BICYCLE,
51
+        final AccessMode[] allModes = new AccessMode[]{ AccessMode.FOOT, null, AccessMode.BICYCLE,
53 52
                 AccessMode.SMALL_MOTORCYCLE, AccessMode.AGRICULTURAL, AccessMode.MOTORCYCLE,
54 53
                 AccessMode.MOTORCAR, AccessMode.HEAVY_GOODS, null, AccessMode.PUBLIC_TRANSPORT };
55 54
 
@@ -240,16 +239,7 @@ public class BinaryGraphReaderInsa2018 extends BinaryReader implements GraphRead
240 239
                 Node dest = nodes.get(destNode);
241 240
 
242 241
                 // Add successor to initial arc.
243
-                ArcForward arc = new ArcForward(orig, dest, length, info, points);
244
-
245
-                // And reverse arc if its a two-way road.
246
-                if (!info.isOneWay()) {
247
-                    // Add without segments.
248
-                    // ArrayList<Point> rPoints = new ArrayList<Point>(points);
249
-                    // Collections.reverse(rPoints);
250
-                    // new Arc(dest, orig, length, info, null);
251
-                    new ArcBackward(arc);
252
-                }
242
+                Arc arc = Node.linkNodes(orig, dest, length, info, points);
253 243
                 observers.forEach((observer) -> observer.notifyNewArcRead(arc));
254 244
             }
255 245
         }
@@ -261,7 +251,7 @@ public class BinaryGraphReaderInsa2018 extends BinaryReader implements GraphRead
261 251
 
262 252
         this.dis.close();
263 253
 
264
-        return new Graph(mapId, mapName, nodes, new GraphInformation(maxSpeed, maxLength));
254
+        return new Graph(mapId, mapName, nodes, new GraphStatistics(maxSpeed, maxLength));
265 255
     }
266 256
 
267 257
     /**

+ 7
- 9
src/main/org/insa/graphics/drawing/components/BasicDrawing.java View File

@@ -22,7 +22,6 @@ import java.util.List;
22 22
 import javax.swing.JPanel;
23 23
 
24 24
 import org.insa.graph.Arc;
25
-import org.insa.graph.ArcForward;
26 25
 import org.insa.graph.Graph;
27 26
 import org.insa.graph.Node;
28 27
 import org.insa.graph.Path;
@@ -395,7 +394,6 @@ public class BasicDrawing extends JPanel implements Drawing {
395 394
 
396 395
     /*
397 396
      * (non-Javadoc)
398
-     * 
399 397
      * @see org.insa.graphics.drawing.Drawing#clear()
400 398
      */
401 399
     @Override
@@ -411,7 +409,6 @@ public class BasicDrawing extends JPanel implements Drawing {
411 409
 
412 410
     /*
413 411
      * (non-Javadoc)
414
-     * 
415 412
      * @see org.insa.graphics.drawing.Drawing#clearOverlays()
416 413
      */
417 414
     @Override
@@ -472,7 +469,6 @@ public class BasicDrawing extends JPanel implements Drawing {
472 469
 
473 470
     /*
474 471
      * (non-Javadoc)
475
-     * 
476 472
      * @see
477 473
      * org.insa.graphics.drawing.Drawing#addDrawingClickListener(org.insa.graphics.
478 474
      * drawing.DrawingClickListener)
@@ -484,7 +480,6 @@ public class BasicDrawing extends JPanel implements Drawing {
484 480
 
485 481
     /*
486 482
      * (non-Javadoc)
487
-     * 
488 483
      * @see org.insa.graphics.drawing.Drawing#removeDrawingClickListener(org.insa.
489 484
      * graphics.drawing.DrawingClickListener)
490 485
      */
@@ -528,9 +523,9 @@ public class BasicDrawing extends JPanel implements Drawing {
528 523
      * 
529 524
      * @param arc Arc to draw.
530 525
      * @param palette Palette to use to retrieve color and width for arc, or null to
531
-     *        use current settings.
526
+     * use current settings.
532 527
      */
533
-    protected void drawArc(ArcForward arc, GraphPalette palette, boolean repaint) {
528
+    protected void drawArc(Arc arc, GraphPalette palette, boolean repaint) {
534 529
         List<Point> pts = arc.getPoints();
535 530
         if (!pts.isEmpty()) {
536 531
             if (palette != null) {
@@ -645,8 +640,11 @@ public class BasicDrawing extends JPanel implements Drawing {
645 640
 
646 641
         for (Node node: graph.getNodes()) {
647 642
             for (Arc arc: node.getSuccessors()) {
648
-                if (arc instanceof ArcForward) { // draw only "true" arcs
649
-                    drawArc((ArcForward) arc, palette, false);
643
+                // Draw arcs only if there are one-way arcs or if origin is lower than
644
+                // destination, avoid drawing two-ways arc twice.
645
+                if (arc.getRoadInformation().isOneWay()
646
+                        || arc.getOrigin().compareTo(arc.getDestination()) < 0) {
647
+                    drawArc(arc, palette, false);
650 648
                 }
651 649
             }
652 650
             if (node.getId() % repaintModulo == 0) {

Loading…
Cancel
Save