Метод базовой точки
При программировании сложных изображений, состоящих из множества элементов, используется метод, который называется методом базовой точки. Суть этого метода заключается в следующем:
1. Выбирается некоторая точка изображения, которая принимается за базовую.
2. Координаты остальных точек отсчитываются от базовой точки.
3. Если координаты точек изображения отсчитывать от базовой в относительных единицах, а не в пикселях, то обеспечивается возможность масштабирования изображения.
Например, нам нужно изобразить букву «О». Ее размеры зададим переменными a и b. Координаты углов показаны на рисунке. За базовую точку мы примем нижний левый угол, ее координаты будут (x,y). Остальные будем рассчитывать относительно ее. Напомним, что ось ОY направлена в низ.
Толщину вертикальной части буквы обозначим переменной с. Она будет составлять 30 процентов от ширины буквы. Для ее вычисления используем функцию Trunc. Которая округляет результат вычисления значения переменной с. Толщину горизонтальной части буквы обозначим d. Она будет составлять 10 процентов от высоты буквы. Координаты внутренней части вычисляем с использованием переменных c и d. (см. рисунок).
Текст программы изображающей букву "О"
program n1;
Uses Crt,GraphABC;
var x,y,a,b,c,d:integer;
begin
Clrscr;
x:=100;
y:=300;
a:=300;
b:=200;
line(x,y,x+a,y);
line(x+a,y,x+a,y-b);
line(x+a,y-b,x,y-b);
line(x,y-b,x,y);
c:=trunc(a*0.3);
d:=trunc(b*0.1);
line(x+c,y-d,x+c,y-b+d);
line(x+a-c,y-d,x+a-c,y-b+d);
line(x+c,y-d,x+a-c,y-d);
line(x+c,y-b+d,x+a-c,y-b+d);
FloodFill(x+4,y-4,clRed) ;
end.
Недавно наткнулся на задачу, связанную с методом базовой точки. Хочу предложить ее решение. Хоть в ней и говорится, что диаметр окружности постоянный, его тоже можно масштабировать.
uses crt,graphabc;
var a,x,y:integer;
begin
clrscr;
write('Введи размер от 5-10 =');read(a);
x:=50;
y:=250;
a:=a*20;
line(x,y-trunc(a/4),x,y-trunc(a/2));
line(x,y-trunc(a/2),x+trunc((a/4)*3),y-trunc(a/2));
line(x+trunc(a/4),y,x+a,y);
line(x+a,y,x+a,y-trunc(a/4));
Arc(x+trunc(a/4),y-trunc(a/4),trunc(a/4),180,270);
Arc(x+trunc((a/4)*3),y-trunc(a/4),trunc(a/4),0,90);
circle(x+trunc(a/2),y-trunc(a/4),trunc(a/6));
end.
|