Среда программирования:
IntelliJ IDEA
Статья по теме:
Горизонтальные и вертикальные линии не нуждаются в сглаживании(рисуем их отдельно). Для остальных линий выбираем основную ось и идём вдоль неё, подбирая координаты по оставшейся(неосновной) оси. На каждой итерации устанавливаем две точки - рассчитываем величину ошибки и видим, как сильно ушли пиксели от идеальной линии по неосновной оси, на основе этих данных распределяем интенсивность между выбранными точками.
Код программы:
package com.company.tests; import javax.swing.*; import java.awt.*; public class XiaolinView extends JPanel { public void paintComponent(Graphics g) { drawXiaolinLine(50, 60, 300, 600, g); } private void drawXiaolinLine(int x1, int y1, int x2, int y2, Graphics g) { if (x2 < x1) { x1 += x2; x2 = x1 - x2; x1 -= x2; y1 += y2; y2 = y1 - y2; y1 -= y2; } int dx = x2 - x1; int dy = y2 - y1; //Горизонтальные и вертикальные линии не нуждаются в сглаживании if (dx == 0 || dy == 0) { g.setColor(Color.BLACK); g.drawLine(x1, y1, x2, y2); return; } float gradient = 0; if (dx > dy) { gradient = (float) dy / dx; float intery = y1 + gradient; g.setColor(Color.BLACK); g.drawLine(x1, y1, x1, y1); for (int x = x1; x < x2; ++x) { g.setColor(new Color(0, 0, 0, (int) (255 - fractionalPart(intery) * 255))); //Меняем прозрачность g.drawLine(x, (int)intery, x, (int)intery); g.setColor(new Color(0, 0, 0, (int) (fractionalPart(intery) * 255))); g.drawLine(x, (int)intery + 1, x, (int)intery + 1); intery += gradient; } g.setColor(Color.BLACK); g.drawLine(x2, y2, x2, y2); } else { gradient = (float) dx / dy; float interx = x1 + gradient; g.setColor(Color.BLACK); g.drawLine(x1, y1, x1, y1); for (int y = y1; y < y2; ++y) { g.setColor(new Color(0, 0, 0, (int) (255 - fractionalPart(interx) * 255))); g.drawLine((int)interx, y, (int)interx, y); g.setColor(new Color(0, 0, 0, (int) (fractionalPart(interx) * 255))); g.drawLine((int)interx + 1, y, (int)interx + 1, y); interx += gradient; } g.setColor(Color.BLACK); g.drawLine(x2, y2, x2, y2); } } private float fractionalPart(float x) { int tmp = (int) x; return x - tmp; //вернёт дробную часть числа } }
Прикрепленный файл | Размер |
---|---|
Xiaolin.zip | 11.79 кб |