Mercurial > dive4elements > gnv-client
comparison gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.java @ 447:92b7ccbf6163
Improved generation of iso lines in vertical cross section.
gnv-artifacts/trunk@495 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 01 Jan 2010 21:52:41 +0000 |
parents | f42ed4f10b79 |
children | 9a828e5a2390 |
comparison
equal
deleted
inserted
replaced
446:f5a041000357 | 447:92b7ccbf6163 |
---|---|
82 do { ++length; } | 82 do { ++length; } |
83 while ((current = current.next) != null && current != this); | 83 while ((current = current.next) != null && current != this); |
84 return length; | 84 return length; |
85 } | 85 } |
86 | 86 |
87 public Edge head() { | |
88 Edge current = this; | |
89 while (current.prev != null) { | |
90 current = current.prev; | |
91 } | |
92 return current; | |
93 } | |
94 | |
87 public int hashCode() { | 95 public int hashCode() { |
88 return (a << 16) | b; | 96 return (a << 16) | b; |
89 } | 97 } |
90 | 98 |
91 public boolean equals(Object other) { | 99 public boolean equals(Object other) { |
94 } | 102 } |
95 } // class Edge | 103 } // class Edge |
96 | 104 |
97 protected static Edge simplify(Edge edge, int width) { | 105 protected static Edge simplify(Edge edge, int width) { |
98 | 106 |
99 Edge e1 = edge; | 107 Edge e1 = edge, start = edge; |
100 Edge e2 = edge.next; | |
101 Edge e3 = e2.next; | |
102 | 108 |
103 int length = edge.length(); | 109 int length = edge.length(); |
104 | 110 |
105 if (length < 2) { | 111 if (length < 2) { |
106 return e1; | 112 return e1; |
107 } | 113 } |
114 | |
115 Edge e2 = edge.next; | |
108 | 116 |
109 int count = 0; | 117 int count = 0; |
110 | 118 |
111 do { | 119 do { |
112 int e1x = e1.a % width; | 120 int e1x = e1.a % width; |
113 int e1y = e1.a / width; | 121 int e1y = e1.a / width; |
114 int e2x = e2.a % width; | 122 int e2x = e1.b % width; |
115 int e2y = e2.a / width; | 123 int e2y = e1.b / width; |
116 int e3x = e3.a % width; | 124 int e3x = e2.b % width; |
117 int e3y = e3.a / width; | 125 int e3y = e2.b / width; |
118 | 126 |
119 if ((e1x == e2x && e2x == e3x && e1x == e3x) | 127 if ((e1x == e2x && e2x == e3x && e1x == e3x) |
120 || (e1y == e2y && e2y == e3y && e1y == e3y)) { | 128 || (e1y == e2y && e2y == e3y && e1y == e3y)) { |
121 e1.next = e3; | 129 e1.b = e2.b; |
122 e3.prev = e1; | 130 Edge removed = e1.next; |
123 e2 = e3; | 131 e1.next = e2.next; |
124 e3 = e2.next; | 132 if (e1.next != null) { |
133 e1.next.prev = e1; | |
134 } | |
135 e2 = e1.next; | |
125 count = 0; | 136 count = 0; |
126 --length; | 137 --length; |
138 if (removed == start) { | |
139 start = e1; | |
140 } | |
127 } | 141 } |
128 else { | 142 else { |
129 e1 = e1.next; | 143 e1 = e1.next; |
130 e2 = e2.next; | 144 e2 = e2.next; |
131 e3 = e3.next; | |
132 ++count; | 145 ++count; |
133 } | 146 } |
134 } | 147 } |
135 while (length > 1 && count < length + 2); | 148 while (length > 1 && e2 != null && count < length + 2); |
136 | 149 |
137 return e1; | 150 return start; |
138 } | 151 } |
139 | 152 |
140 protected int [] raster; | 153 protected int [] raster; |
141 protected int width; | 154 protected int width; |
142 protected TIntObjectHashMap openEdges; | 155 protected TIntObjectHashMap openEdges; |