Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

Счетчики и рейтинг

Яндекс.Метрика Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
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.zip11.79 кб