Программирование >>  Поддержка объектно-ориентированного программирования 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 120


void put point(int a, int b)

if (on screen(a,b)) screen[a] [b] = black;

Для рисования прямых линий используется функция put line():

void put line(int x0, int y0, int x1, int y1)

(x1,y1). = 0.

*/ {

Нарисовать отрезок прямой (x0,y0) -Уравнение прямой: b(x-x0) + a(y-y0) Минимизируется величина abs(eps), где eps = 2*(b(x-x0)) + a(y-y0). См. Newman, Sproull

Principles of interactive Computer Graphics McGraw-Hill, New York, 1979. pp. 33-34.

register int dx = 1;

int a = x1 - x0;

if (a < 0) dx = -1, a = -a;

register int dy = 1;

int b = y1 - y0;

if (b < 0) dy = -1, b = -b;

int two a = 2*a;

int two b = 2*b;

int xcrit = -b + two a; register int eps = 0;

for (;;) {

put point(x0,y0);

if (x0==x1 && y0==y1) break;

if (eps <= xcrit) x0 +=dx, eps +=two b;

if (eps>=a a<b) y0 +=dy, eps -=two a;

#include screen.h #include <stream.h>

enum color { black=*, white=

char screen[XMAX] [YMAX]; void screen init()

for (int y=0; y<YMAX; y++) for (int x=0; x<XMAX; x++) screen[x] [y] = white;

Функция

void screen destroy() { }

приведена просто для полноты картины. В реальных системах обычно нужны подобные функции уничтожения объекта.

Точки записываются, только если они попадают на экран:

inline int on screen(int a, int b) проверка попадания

return 0<=a && a <XMAX && 0<=b && b<YMAX;



Имеются функции для очистки и обновления экрана:

void screen clear() { screen init(); } void screen refresh()

for (int y=YMAX-1; 0<=y; y--) { с верхней строки до нижней for (int x=0; x<XMAX; x++) от левого столбца до правого

cout << screen[x] [y]; cout << \n;

Но нужно понимать, что все эти определения хранятся в некоторой библиотеке как результат работы транслятора, и изменить их нельзя.

6.4.2 Библиотека фигур

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

struct shape {

static shape* list; shape* next;

shape() { next = list; list = this; } virtual point north() const = 0; virtual point south() const = 0; virtual point east() const = 0; virtual point west() const = 0; virtual point neast() const = 0; virtual point seast() const = 0; virtual point nwest() const = 0; virtual point swest() const = 0; virtual void draw() = 0; virtual void move(int, int) = 0;

Фигуры помещаются на экран функцией draw(), а движутся по нему с помощью move(). Фигуры можно помещать относительно друг друга, используя понятие точек контакта. Для обозначения точек контакта используются названия сторон света в компасе: north - север, ... , neast - северо-восток, ... , swest - юго-запад. Класс каждой конкретной фигуры сам определяет смысл этих точек и определяет, как рисовать фигуру. Конструктор shape::shape() добавляет фигуру к списку фигур shape::list. Для построения этого списка используется член next, входящий в каждый объект shape. Поскольку нет смысла в объектах типа общей фигуры, класс shape определен как абстрактный класс.

Для задания отрезка прямой нужно указать две точки или точку и целое. В последнем случае отрезок будет горизонтальным, а целое задает его длину. Знак целого показывает, где должна находиться заданная точка относительно конечной точки, т.е. слева или справа от нее:

class line : public shape {

отрезок прямой [ w , e ]

north() определяет точку - выше центра отрезка и так далеко на север, как самая его северная точка

point w, e; public:

point north() const { return point((w.x+e.x)/2,e.y<w.y?w.y:e:y); } point south() const { return point((w.x+e.x)/2,e.y<w.y?e.y:w.y); } point east() const;



point west() const; point neast() const; point seast() const; point nwest() const; point swest() const; void move(int a, int b)

{ w.x +=a; w.y +=b; e.x +=a; e.y +=b; }

void draw() { put line(w,e); }

line(point a, point b) { w = a; e = b; }

line(point a, int l) { w = point(a.x+l-1,a.y); e = a; }

Аналогично определяется прямоугольник:

class rectangle : public shape {

/* nw ------ n -----ne

w c e

sw ------ s -----se

point sw, ne; public:

point north() const { return point((sw.x+ne.x)/2,ne.y); } point south() const { return point((sw.x+ne.x)/2,sw.y); } point east() const; point west() const; point neast() const { return ne; } point seast() const; point nwest() const; point swest() const { return sw; } void move(int a, int b)

{ sw.x+=a; sw.y+=b; ne.x+=a; ne.y+=b; } void draw(); rectangle(point,point);

Прямоугольник строится по двум точкам. Конструктор усложняется, так как необходимо выяснять относительное положение этих точек:

rectangle::rectangle(point a, point b)

if (a.x <= b.x) { if (a.y <= b.y) { sw = a; ne = b;

else {

sw = point(a.x,b.y); ne = point(b.x,a.y);

else {

if (a.y <= b.y) {

sw = point(b.x,a.y); ne = point(a.x,b.y);

else { sw = b;



1 ... 47 48 49 [ 50 ] 51 52 53 ... 120

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика