永发信息网

扫描线种子填充算法 用Java写的

答案:1  悬赏:0  手机版
解决时间 2021-05-23 04:20
  • 提问者网友:星軌
  • 2021-05-22 06:29
扫描线种子填充算法 用Java写的,不要C++!!
最佳答案
  • 五星知识达人网友:春色三分
  • 2021-05-22 07:52
扫描线种子填充算法思想

首先填充种子所在的尚未填充的一区段,然后确定与这一区段相邻的上下两条扫描线上位于该区段内是否存在需要填充的新区段,如果存在,则依次把每个新区段最右端的象素作为种子放入堆栈。反复这个过程,直到堆栈为空。

扫描线种子填充算法步骤

1、初始化堆栈。

2、种子压入堆栈。

3、While(堆栈非空)从堆栈弹出种子象素。
{
(1)如果种子象素尚未填充,则:

① 求出种子区段:xleft、xright。
② 填充整个区段。

(2)检查相邻的上扫描线的xleft ≤ x ≤ xright区间内,是否存在需要填充的新区段,如果存在,则把每个新区段在xleft ≤ x ≤ xright范围内的最右边的象素,作为新的种子象素依次压入堆栈。

(3)检查相邻的下扫描线的xleft≤x≤xright区间内,是否存在需要填充的新区段,如果存在,则把每个新区段在xleft≤x≤xright范围内的最右边的象素,作为新的种子象素依次压入堆栈。

}

以上是一些相关的知识提要,接下来是一份算法的Java代码:

包括两个类:

view plaincopy to clipboardprint?

1. package com.tony.view;
2.
3. import java.awt.Color;
4. import java.awt.Graphics;
5. import java.awt.Image;
6. import java.awt.Point;
7. import java.awt.Robot;
8. import java.awt.image.BufferedImage;
9. import java.util.Vector;
10.
11. import javax.swing.JPanel;
12.
13. public class DrawComponentPanel extends JPanel {
14. private int[] xPoints = new int[4];
15. private int[] yPoints = new int[4];
16. private Color fillColor;
17. private Color curColor;
18. private boolean fill = false;
19.
20. public DrawComponentPanel() {
21. xPoints[0] = 0;
22. xPoints[1] = 0;
23. xPoints[2] = 0;
24. xPoints[3] = 0;
25. yPoints[0] = 0;
26. yPoints[1] = 0;
27. yPoints[2] = 0;
28. yPoints[3] = 0;
29. }
30.
31. protected void paintComponent(final Graphics g) {
32. super.paintComponent(g);
33. Robot robot = null;
34. Point p;
35. try {
36. robot = new Robot();
37. } catch (Exception ex) {
38. ex.printStackTrace();
39. }
40. Vector v = new Vector();
41. int savex = 0, xleft = 0, xright = 0, pflag = 0, xenter = 0, x = 0, y = 0;
42. p = new Point(xPoints[0] + 1, yPoints[0] + 1);
43. v.add(0, p);
44. // System.out.println(" " + ((Point) v.get(0)).x);
45.
46. BufferedImage image = (BufferedImage)this.createImage(700, 700);
47. Graphics ig = image.getGraphics();
48. ig.setColor(Color.black);
49. ig.drawPolygon(xPoints, yPoints, 4);
50. ig.setColor(fillColor);
51. g.drawImage(image, 0, 0, null);
52.
53.
54. while (v.size() != 0 && fill) {
55.
56. x = ((Point) v.get(0)).x;
57. y = ((Point) v.get(0)).y;
58. v.remove(0);
59. // System.out.println("x:" + x + "y:" + y + "Color.BLack"
60. // + Color.BLACK.getRGB() + "robot.getPixelColor(x, y).getRGB():" + image.getRGB(x, y));
61.
62. savex = x;
63.
64. while (image.getRGB(x, y) != Color.BLACK.getRGB()) {
65. ig.drawLine(x, y, x, y);
66. x++;
67. // System.out.println("--------->x" + x);
68. }
69.
70.
71.
72. xright = x - 1;
73. x = savex - 1;
74. System.out.println("--------->0");
75. while (image.getRGB(x, y) != Color.BLACK.getRGB()) {
76. ig.drawLine(x, y, x, y);
77. x--;
78. // System.out.println("--------->x" + x);
79. }
80.
81. // System.out.println("--------->1");
82.
83. xleft = x + 1;
84. x = xleft;
85. y = y - 1;
86.
87. while (x <= xright) {
88. pflag = 0;
89. while (image.getRGB(x, y) != Color.BLACK
90. .getRGB()
91. && image.getRGB(x, y) != fillColor
92. .getRGB() && x < xright) {
93. if (pflag == 0) {
94. pflag = 1;
95. }
96. x++;
97. }
98. // System.out.println("--------->1.1");
99.
100. if (pflag == 1) {
101. if ((x == xright)
102. && image.getRGB(x, y) != Color.BLACK
103. .getRGB()
104. && image.getRGB(x, y) != fillColor
105. .getRGB()) {
106. p = new Point(x, y);
107. v.add(0, p); // 新区间超过xRight,将代表该区段的象素进栈
108. } else {
109. p = new Point(x - 1, y);
110. v.add(0, p);
111. }
112. pflag = 0;
113. }
114. // System.out.println("--------->1.2");
115.
116. xenter = x;
117. while ((image.getRGB(x, y) == Color.BLACK
118. .getRGB()
119. || image.getRGB(x, y) == fillColor
120. .getRGB()) && (x < xright)) {
121. x++;
122. }
123. // System.out.println("--------->1.3");
124.
125. if (xenter == x) {
126. x++;
127. }
128. }
129.
130. // System.out.println("--------->2");
131.
132. x = xleft;
133. y = y + 2;
134. while(x <= xright){
135. pflag = 0;
136. while (image.getRGB(x, y) != Color.BLACK
137. .getRGB()
138. && image.getRGB(x, y) != fillColor
139. .getRGB() && x < xright) {
140. if (pflag == 0) {
141. pflag = 1;
142. }
143. x++;
144. }
145. // System.out.println("--------->2.1");
146. if (pflag == 1) {
147. if ((x == xright)
148. && image.getRGB(x, y) != Color.BLACK
149. .getRGB()
150. && image.getRGB(x, y) != fillColor
151. .getRGB()) {
152. p = new Point(x, y);
153. v.add(0, p); // 新区间超过xRight,将代表该区段的象素进栈
154. } else {
155. p = new Point(x - 1, y);
156. v.add(0, p);
157. }
158. pflag = 0;
159. }
160. // System.out.println("--------->2.2");
161. xenter = x;
162. while ((image.getRGB(x, y) == Color.BLACK
163. .getRGB()
164. || image.getRGB(x, y) == fillColor
165. .getRGB()) && (x < xright)) {
166. x++;
167. }
168. // System.out.println("--------->2.3");
169. if (xenter == x) {
170. x++;
171. }
172. // System.out.println("--------->2.4");
173. }
174. g.drawImage(image, 0, 0, null);
175. // System.out.println("--------->3");
176. // System.out.println("v.size:" + v.size());
177. }
178.
179. fill = false;
180.
181. }
182.
183. public int[] getXPoints() {
184. return xPoints;
185. }
186.
187. public void setXPoints(int[] points) {
188. xPoints = points;
189. }
190.
191. public int[] getYPoints() {
192. return yPoints;
193. }
194.
195. public void setYPoints(int[] points) {
196. yPoints = points;
197. }
198.
199. public Color getFillColor() {
200. return fillColor;
201. }
202.
203. public void setFillColor(Color fillColor) {
204. this.fillColor = fillColor;
205. }
206.
207. public boolean isFill() {
208. return fill;
209. }
210.
211. public void setFill(boolean fill) {
212. this.fill = fill;
213. }
214.
215.
216.
217. }
我实现的时候,用Vector来做为栈来保存种子,还有就是我用BufferedImage作为一块二级缓存画布,这样可以比较方便获取点的颜色,和网上很多用Robot获取点的颜色的方法不太一样~~
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯