Graphic Rendering System 1.0
A Java-based graphic rendering system implementing various design patterns
Loading...
Searching...
No Matches
ConsoleRenderer.java
Go to the documentation of this file.
1package com.example.graphics.render;
2
3import com.example.graphics.model.Circle;
4import com.example.graphics.model.Line;
5import com.example.graphics.model.Rectangle;
6import com.example.graphics.model.Triangle;
7
12public class ConsoleRenderer implements Renderer {
13 private final int width;
14 private final int height;
15 private char[][] canvas;
16
22 public ConsoleRenderer(int width, int height) {
23 this.width = width;
24 this.height = height;
25 clear();
26 }
27
28 @Override
29 public void renderCircle(Circle circle) {
30 int x0 = circle.getX();
31 int y0 = circle.getY();
32 int radius = circle.getRadius();
33
34 // Using Bresenham's circle algorithm
35 int x = radius;
36 int y = 0;
37 int err = 0;
38
39 while (x >= y) {
40 drawPixel(x0 + x, y0 + y);
41 drawPixel(x0 + y, y0 + x);
42 drawPixel(x0 - y, y0 + x);
43 drawPixel(x0 - x, y0 + y);
44 drawPixel(x0 - x, y0 - y);
45 drawPixel(x0 - y, y0 - x);
46 drawPixel(x0 + y, y0 - x);
47 drawPixel(x0 + x, y0 - y);
48
49 y += 1;
50 if (err <= 0) {
51 err += 2 * y + 1;
52 }
53 if (err > 0) {
54 x -= 1;
55 err -= 2 * x + 1;
56 }
57 }
58 }
59
60 @Override
61 public void renderRectangle(Rectangle rectangle) {
62 int x = rectangle.getX();
63 int y = rectangle.getY();
64 int w = rectangle.getWidth();
65 int h = rectangle.getHeight();
66
67 // Draw horizontal lines
68 for (int i = x; i < x + w; i++) {
69 drawPixel(i, y);
70 drawPixel(i, y + h - 1);
71 }
72
73 // Draw vertical lines
74 for (int i = y; i < y + h; i++) {
75 drawPixel(x, i);
76 drawPixel(x + w - 1, i);
77 }
78 }
79
80 @Override
81 public void renderLine(Line line) {
82 int x1 = line.getX1();
83 int y1 = line.getY1();
84 int x2 = line.getX2();
85 int y2 = line.getY2();
86
87 // Using Bresenham's line algorithm
88 int dx = Math.abs(x2 - x1);
89 int dy = Math.abs(y2 - y1);
90 int sx = x1 < x2 ? 1 : -1;
91 int sy = y1 < y2 ? 1 : -1;
92 int err = dx - dy;
93
94 while (true) {
95 drawPixel(x1, y1);
96
97 if (x1 == x2 && y1 == y2) break;
98
99 int e2 = 2 * err;
100 if (e2 > -dy) {
101 if (x1 == x2) break;
102 err -= dy;
103 x1 += sx;
104 }
105 if (e2 < dx) {
106 if (y1 == y2) break;
107 err += dx;
108 y1 += sy;
109 }
110 }
111 }
112
113 @Override
114 public void renderTriangle(Triangle triangle) {
115 // 使用三条线来绘制三角形
116 int x1 = triangle.getX1();
117 int y1 = triangle.getY1();
118 int x2 = triangle.getX2();
119 int y2 = triangle.getY2();
120 int x3 = triangle.getX3();
121 int y3 = triangle.getY3();
122
123 // 绘制第一条边
124 drawLine(x1, y1, x2, y2);
125
126 // 绘制第二条边
127 drawLine(x2, y2, x3, y3);
128
129 // 绘制第三条边
130 drawLine(x3, y3, x1, y1);
131 }
132
133 @Override
134 public void clear() {
135 canvas = new char[height][width];
136 for (int y = 0; y < height; y++) {
137 for (int x = 0; x < width; x++) {
138 canvas[y][x] = ' ';
139 }
140 }
141 }
142
143 @Override
144 public void display() {
145 System.out.println("Console Renderer Output:");
146 // Print top border
147 System.out.print('+');
148 for (int x = 0; x < width; x++) {
149 System.out.print('-');
150 }
151 System.out.println('+');
152
153 // Print canvas with borders
154 for (int y = 0; y < height; y++) {
155 System.out.print('|');
156 for (int x = 0; x < width; x++) {
157 System.out.print(canvas[y][x]);
158 }
159 System.out.println('|');
160 }
161
162 // Print bottom border
163 System.out.print('+');
164 for (int x = 0; x < width; x++) {
165 System.out.print('-');
166 }
167 System.out.println('+');
168 }
169
175 private void drawPixel(int x, int y) {
176 if (x >= 0 && x < width && y >= 0 && y < height) {
177 canvas[y][x] = '*';
178 }
179 }
180
188 private void drawLine(int x1, int y1, int x2, int y2) {
189 // Using Bresenham's line algorithm
190 int dx = Math.abs(x2 - x1);
191 int dy = Math.abs(y2 - y1);
192 int sx = x1 < x2 ? 1 : -1;
193 int sy = y1 < y2 ? 1 : -1;
194 int err = dx - dy;
195
196 while (true) {
197 drawPixel(x1, y1);
198
199 if (x1 == x2 && y1 == y2) break;
200
201 int e2 = 2 * err;
202 if (e2 > -dy) {
203 if (x1 == x2) break;
204 err -= dy;
205 x1 += sx;
206 }
207 if (e2 < dx) {
208 if (y1 == y2) break;
209 err += dx;
210 y1 += sy;
211 }
212 }
213 }
214}
void drawLine(int x1, int y1, int x2, int y2)