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;

http://dive4elements.wald.intevation.org