Компьютерная графика. Как делать многоугольники, страница 2

Причем подпрограмма вывода линии не рисует всю линию, а только те места, где значение y изменяется. Сплошная линию появиться, если Вы рисуете от (0,0) до (0,10), но это также, приводит к разряженной линии, если Вы рисуете от (0,0) до (10,1). Следовательно, Вы не можете использовать это как обычную подпрограмму вывода линии. Но в этом и состоит трюк. Почему этот алгоритм работает, я не комментирую в настоящее время, но я могу гарантировать Вас, что это работает прекрасно. Теперь, почему мы должны использовать эту подпрограмму строки, во-первых? Да, вы правы, мы должны рисовать линии от точки к точке. Если Вы рассматриваете вышеупомянутый рисунок, Вы можете видеть, что независимо от того, как посмотреть на треугольник, в нем всегда будет самая нижняя и самая верхняя точки. Это означает, что всегда будет иметься точка, которая находится в середине. Примем, что строка между самой верхней и самой нижней линией является основной линией. В вышеупомянутом примере основная линия: fig1/red, fig2/blue и fig3/blue. Так как эти строки самые длинные. На рисунке один и два Вы можете видеть,  средняя точка слева из основной линии, но в третьем примере, она справа. Далее мы расчленим наш многоугольник на две половины, в одном только одна линия, а именно основная линия, и в другом, который идет от нижней точки до средней точки и обратно снова к самой верхней точке. Давайте назовем линию (скорее две линии) , которая включает среднею линию, линия разделения. Обратите внимание, что и линия разделения и основная линия заканчиваются и начинаются в той же самой точке, а именно min_y и max_y. Теперь, что мы действительно хотели делать со всеми, что это должно было нарисовать многоугольник, не только строки, но и внутри многоугольника. Чтобы сделать это проще для понимания, мы используем рисунок три как стандарт теперь, так как в нем основная линия -  прямая и мы не должны волноваться об один (всегда при сдвиге по y х остается неизменным). Теперь мы делаем массив давайте назовем его xpos. Так как многоугольник может закрывать весь экран, мы должны иметь [200] элементов, фактически значению Y позиции самой (в массиве) - значение X. Давайте проиллюстрируем это:

figure 4 Рисунок 4

As you can see the line routine only writtes a dot each time the y value changes. But this is exellent for our purposs, since we have just made an array where the x value may vary, but the y value changes by one (since we have [200] elements and each element represent the x value in that perticular y position). Let's use figure four to explain this. Pretent each y line in the figure equals [line]. That is figure y line number one is xpos[1], y line two is xpos[2] and so on. On the first line there is no dots, but on the second line there is two. Now, how do we handle this? Simple, we make another array, one representing the mainline (Blue line) and one representing the splitline (red and green). Lets make it in the same array as the xpos[200], and change it to xpos[200][2]. Now, all we have to do is to draw the mainline and the splitline in the array. Lets rewrite our drawline a bit, calling it drawedge, since that is what we do now:

Как Вы видели, подпрограмма строки только рисовала точку каждый раз, когда изменяется значение y. Но это великолепно подходит для нашего использования, так как мы только что сделали массив, где значение x может измениться, но y значение изменяется на один (так как мы имеем [200] элементов, и каждый элемент представляет значение x в соответствующей y позиции). Давайте использовать рисунок четыре, чтобы пояснить это. Каждой y строке на рисунке равняется [строке]. На рисунке для строки y номер 2 - xpos[1], для строки y 2 - xpos [2] и так далее. На первой строке не имеется никаких точек, но на второй строке имеется две. Теперь, как мы обрабатываем это? Просто, мы делаем другой массив, при этом один массив для представления основной линия (синяя линия) и другой для представления линии разделения (красная и зеленая линии). Давайте сделаем это в том же самом массиве как xpos [200], и изменим его на xpos [200] [2]. Теперь, все, что мы должны делать, должны рисовать основную линию и линию разделения в массиве. Давайте изменим нашу drawline немного, при вызове ее из drawedge: