Методические указания к лабораторным работам по курсу “Компьютерная графика”, страница 10

Известны корни ,  и  многочлена третьей степени . Вывести на экран области притяжения этих корней относительно отображения Ньютона . Граница этих областей составляет фрактальное множество Ньютона.

Для каждого варианта задана тройка корней многочлена :

Вариант

Вариант

1

11

2

12

3

13

4

14

5

15

6

16

7

17

8

18

9

19

10

20

6. Пример выполнения задания

Пример 12. Корни многочлена  равны , , . Найдем область притяжения этих корней относительно отображения Ньютона. Область притяжения  будем раскрашивать в красный цвет,  – в зеленый,  – в синий. По формуле Виеты находим . Производная от функции  равна . Рассматриваем комплексные числа, принадлежащие области комплексной плоскости, состоящей из точек , удовлетворяющих соотношениям  и . Каждое такое число берем в качестве первого приближения . Применяем к нему преобразование  до тех пор, пока не будет достигнуто выполнение неравенства . Затем находим корень, близкий к , и закрашиваем исходную точку  в соответствующий цвет. Если приближение корня достигнуто за четное число шагов , то точка окрашивается светлым оттенком этого цвета, иначе – темным.

Программа.

#include<graphics.h>

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<complex.h>

#include<math.h>

#define MITER 100

class Wnd

{

double xmin, ymin, xmax, ymax;

int left, top, right, bottom;

public:

Wnd(double x0, double y0, double x1, double y1,

int xleft = 0, int ytop = 0,

int xright = 639, int ybottom = 479):

xmin(x0), ymin(y0), xmax(x1), ymax(y1),

left(xleft), top(ytop)

{

if(xleft < 0 || ytop < 0)

{

printf("\n Error in the output domain"); exit(1);

}

if(xright < 0) right = getmaxx();

else right = xright;

if(ybottom < 0) bottom = getmaxy();

else bottom = ybottom;

}

int ex(double x);

int ey(double y);

void putpoint(double x, double y, int color);

};

int Wnd::ex(double x)

{

return left + (x - xmin) * (right - left) / (xmax - xmin);

}

int Wnd::ey(double y)

{

return top + (ymax - y) * (bottom - top) / (ymax - ymin);

}

int colors[6]={RED, LIGHTRED, GREEN, LIGHTGREEN, BLUE, LIGHTBLUE};

complex f(complex z)

{

return z * z * z – 2 * z * z + 9. * z / 4 -5. / 4;

}

complex fs(complex z)

{

return 3 * z * z – 4 * z + 9. / 4;

}

complex i(0., 1.);

complex root[3];               // = {(1., 0.), (0.5, 1.), (0.5, -1.)};

void Wnd::putpoint(double x, double y, int color)

{

putpixel(ex(x), ey(y), color);

}

int main()

{

int gd = VGA, gm = VGAHI, j;

double re, im, xinc, yinc;

int pput, ncolors = 0,n;

initgraph(&gd, &gm, "..\\BGI");

Wnd w(-2., -2., 2., 2., 0, 0, getmaxx(), getmaxy());

xinc = 4. / 640; yinc = 4. / 480;

complex z;

ncolors = 3; root[0] = 1.; root[1] = 0.5 + i; root[2] = 0.5 - i;