Как реализована функция fillRect Java Graphics(int, int, int, int) [Программирование графики низкого уровня]?

#java #graphics

Вопрос:

Я пытаюсь написать функцию прямоугольника заливки для своего проекта. И мне было интересно, как fillRect(int, int, int, int) java.awt.Graphics реализован метод класса Java. Я попытался найти исходный код, щелкнув правой кнопкой мыши в программе Java и «Открыть объявление» (в среде IDE eclipse), но все, что я могу найти, — это абстрактное объявление метода.

В принципе, я хочу знать, как простой Java-код, подобный этому:

     protected void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(10, 10, 620, 460);
    }
 

можно создать зеленый прямоугольник, подобный включенному в окне ниже:

Зеленый прямоугольник в окне

Я знаю только два метода заполнения формы : алгоритмы заливки и заполнения границ . Проблема с ними заключается в том, что им обоим нужны существующие границы (монохромные для заполнения границ и моно-или полихромные для заполнения заливкой).

так что с алгоритмом заполнения границ это будет что-то вроде :

 void fillRect(int x, int y, int w, int h){
    drawLine(x, y, x w, y);     // Draw top boundary
    drawLine(x, y h, x w, y h); // Draw bottom boundary
    drawLine(x, y, x, y h);     // Draw left boundary
    drawLine(x w, y, x w, y h); // Draw right boundary
    boundaryFill4D(x 1, y 1, GREEN, GREEN); // for simplicity I'm hardcoding color
}

void boundaryFill4D(int x, int y, int fill_color, int boundary_color)
{
    if(getpixel(x, y) != boundary_color amp;amp;
       getpixel(x, y) != fill_color)
    {
        putpixel(x, y, fill_color);
        boundaryFill4D(x   1, y, fill_color, boundary_color);
        boundaryFill4D(x, y   1, fill_color, boundary_color);
        boundaryFill4D(x - 1, y, fill_color, boundary_color);
        boundaryFill4D(x, y - 1, fill_color, boundary_color);
    }
}
 

Как вы можете видеть из этого примера, мне пришлось сначала нарисовать 4 стороны, прежде чем я смог «заполнить ведро» очерченным прямоугольником. Мне было интересно, есть ли лучший способ сделать это.

Комментарии:

1. Я предполагаю, что это зависит от операционной системы. Вот графика Windows. Метод FillRectangle .

2. @GilbertLeBlanc приведенные примеры не показывают, из какого алгоритма/набора инструкций сделан прямоугольник заливки. это просто документирование использования метода.

3. Я предполагаю, что видеопамять модифицируется напрямую, используя любую формулу, которая является самой быстрой.