Информационные технологии для развлечения

Добро пожаловать. Вы не зашли на сайт под своим логином. Вы можете зарегистрироваться или выполнить вход.

Пробей человека: день рождения, адрес, паспортные данные

[Комп. граф.] Лабораторная работа №1, Вариант №№39, 40

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

Заказали мне тут третьекурсники лабораторки по компьютерной графике. Как я посмотрел, задания немножко изменились по сравнению с прошлым годом, ну да ладно.

Смысл первой лабораторки состоит в следующем: на Паскале без подключения модуля Graph нарисовать некие геометрические фигуры, заданные уравнениями.

Почитав присланную мне методичку (скачать можно ниже), я выделил для себя два правила:
1) "Если не указано иное, то текстовым режимом по умолчанию следует считать 20х25х16, а графическим - 320х200х256".
2) "Каждое изображение, построенное в графическом режиме, должно обязательно сопровождаться комментарием на русском языке, выведенным поточечно". 

Итак, по умолчанию используем видеорежим 320х200х256. Его номер по стандарту VGA = 13h. Этот режим 256-цветный, на один пиксел в видеопамяти отводится ровно один байт. Самый удобный видеорежим. Видеопамять начинается с адреса A000h:0, имеет 1 слой и 1 видеостраницу. Одной точке соотвествует байт видеопамяти. Другими словами, чтобы отобразить на экране пиксел какого-либо цвета, нужно записать соответствующее значение цвета в память по адресу $A000:$140*y+x, где x и y соответственно горизонтальная и вертикальная координаты пиксела.

Пример. Отобразить пиксел с координатами (123; 125) и заданным цветом в режиме 13h.

x:= 123;
y:= 45;
color:=14;
Mem[$A000:$140*y+x]:=color; 

А теперь формулировка заданий:

Вар №39. Нарисовать спираль Архимеда.
Формула фигуры:

x(t) = r(t)*cos(t);
y(t) = r(t)*sin(t);
r(t) = r0+r1*t; 

Отсюда видно, что спираль Архимеда имеет равномерно увеличивающийся радиус.

Вар №40. Нарисовать спираль Бернулли.
Формула фигуры:
x(t) = r(t)*cos(t);
y(t) = r(t)*sin(t);
r(t) = r0+e^(r1*t);

Спираль Бернулли образуется при экспоненциально изменяющемся радиусе. 

Самый гемор конечно был с поточечной отрисовкой надписей около фигуры. Но я написал универсальную процедуру, с помощью которой можно вывести любую надпись на английском языке поточечно, не используя модуль Graph и какие-либо шрифты.

Для 39-го варианта получилось следующее:

program lab1_39 ;

var st: string;

procedure PutPixel(x,y:integer;color:byte);
var addr:word;
begin
addr:=320*y+x;
Mem[$A000:addr]:=color;
end;

const
  bits: array[1 .. 28] of array[1 .. 14] of word = (
    (0,0,24,24,36, 36, 36, 126, 66, 66, 129, 129,0,0), {A}
    (0,0,254,129,129,129,254,129,129,129,129,254,0,0), {B}
    (0,0,255,128,128,128,128,128,128,128,128,255,0,0), {C}
    (0,0,254,129,129,129,129,129,129,129,129,254,0,0), {D}
    (0,0,255,128,128,128,254,128,128,128,128,255,0,0), {E}
    (0,0,255,128,128,128,254,128,128,128,128,128,0,0), {F}
    (0,0,126,129,129,128,128,143,131,131,133,125,0,0), {G}
    (0,0,129,129,129,129,255,129,129,129,129,129,0,0), {H}
    (0,0,124,16,16,16,16,16,16,16,16,124,0,0),		{I}
    (0,0,1,1,1,1,1,1,1,129,129,126,0,0), {J}
    (0,0,130,132,136,144,224,144,136,132,130,129,0,0), {K}
	(0,0,128,128,128,128,128,128,128,128,129,255,0,0), {L}
	(0,0,129,195,165,153,153,129,129,129,129,129,0,0), {M}
	(0,0,129,193,161,145,137,133,131,129,129,129,0,0), {N}
	(0,0,126,129,129,129,129,129,129,129,129,126,0,0), {O}
	(0,0,254,129,129,129,254,128,128,128,128,128,0,0), {P}
	(0,0,126,129,129,129,129,129,129,133,131,127,0,0), {Q}
	(0,0,254,129,129,129,254,144,136,132,130,129,0,0), {R}
	(0,0,127,128,128,128,126,1,1,1,1,254,0,0), {S}
	(0,0,254,16,16,16,16,16,16,16,16,16,0,0),  {T}
	(0,0,129,129,129,129,129,129,129,129,129,126,0,0), {U}
	(0,0,129,129,66,66,36,36,36,24,24,24,0,0), {V}
	(0,0,129,129,129,129,129,129,153,153,165,66,0,0), {W}
	(0,0,129,66,36,36,24,24,36,36,66,129,0,0), {X}
	(0,0,130,68,68,40,16,16,16,16,16,16,0,0), {Y}
	(0,0,255,2,4,4,8,16,32,32,64,255,0,0),  {Z}
	(0,0,0,0,0,0,0,0,0,0,0,0,0,0),  {SPACE}
	(0,0,24,24,24,0,0,0,0,0,0,0,0,0)  {'}
  );

procedure putChar(var px, py: integer; ch: char; color:byte);
var x, y: integer;
begin
  for x := 0 to 7 do
    for y := 1 to 14 do begin
      if(bits[pos(ch, st)][y] shr x) and $01 > 0
      then putpixel(px + (7 - x), py + y, color);
    end;
  inc(px, 10);
end;

procedure PrintString( px, py: integer; s: string;color:byte);
var i: integer;
begin
  for i := 1 to length(s) do
    putChar(px, py, s[i],color);
end;

procedure DrawSpiral(color:byte);
  var t,r:real;
      x,y:integer;
  const r0: real = 1.0;
        r1: real = 1.0;
        x0: integer = 160;
        y0: integer = 100;
begin
  t:=0;
  while t<=16*pi do
  begin
    r:=r0+r1*t;
    x:=x0+round(r*cos(t));
    y:=y0+round(r*sin(t));
    PutPixel(x,y,color);
    t:=t+0.001;
  end;
end;


const figureName:string = 'ARCHIMED''S SPIRAL';

begin
asm
  mov ax,13h
  int 10h
end;


DrawSpiral(6);

st:='ABCDEFGHIJKLMNOPQRSTUVWXYZ ''';
PrintString(80,25,figureName,5);

ReadLn;
end.

Результат:

Спираль Архимеда

Вариант №40:


program lab1_40 ;

var st: string;

procedure PutPixel(x,y:integer;color:byte);
var addr:word;
begin
addr:=320*y+x;
Mem[$A000:addr]:=color;
end;

const
  bits: array[1 .. 28] of array[1 .. 14] of word = (
    (0,0,24,24,36, 36, 36, 126, 66, 66, 129, 129,0,0), {A}
    (0,0,254,129,129,129,254,129,129,129,129,254,0,0), {B}
    (0,0,255,128,128,128,128,128,128,128,128,255,0,0), {C}
    (0,0,254,129,129,129,129,129,129,129,129,254,0,0), {D}
    (0,0,255,128,128,128,254,128,128,128,128,255,0,0), {E}
    (0,0,255,128,128,128,254,128,128,128,128,128,0,0), {F}
    (0,0,126,129,129,128,128,143,131,131,133,125,0,0), {G}
    (0,0,129,129,129,129,255,129,129,129,129,129,0,0), {H}
    (0,0,124,16,16,16,16,16,16,16,16,124,0,0),		{I}
    (0,0,1,1,1,1,1,1,1,129,129,126,0,0), {J}
    (0,0,130,132,136,144,224,144,136,132,130,129,0,0), {K}
	(0,0,128,128,128,128,128,128,128,128,129,255,0,0), {L}
	(0,0,129,195,165,153,153,129,129,129,129,129,0,0), {M}
	(0,0,129,193,161,145,137,133,131,129,129,129,0,0), {N}
	(0,0,126,129,129,129,129,129,129,129,129,126,0,0), {O}
	(0,0,254,129,129,129,254,128,128,128,128,128,0,0), {P}
	(0,0,126,129,129,129,129,129,129,133,131,127,0,0), {Q}
	(0,0,254,129,129,129,254,144,136,132,130,129,0,0), {R}
	(0,0,127,128,128,128,126,1,1,1,1,254,0,0), {S}
	(0,0,254,16,16,16,16,16,16,16,16,16,0,0),  {T}
	(0,0,129,129,129,129,129,129,129,129,129,126,0,0), {U}
	(0,0,129,129,66,66,36,36,36,24,24,24,0,0), {V}
	(0,0,129,129,129,129,129,129,153,153,165,66,0,0), {W}
	(0,0,129,66,36,36,24,24,36,36,66,129,0,0), {X}
	(0,0,130,68,68,40,16,16,16,16,16,16,0,0), {Y}
	(0,0,255,2,4,4,8,16,32,32,64,255,0,0),  {Z}
	(0,0,0,0,0,0,0,0,0,0,0,0,0,0),  {SPACE}
	(0,0,24,24,24,0,0,0,0,0,0,0,0,0)  {'}
  );

procedure putChar(var px, py: integer; ch: char; color: byte);
var x, y: integer;
begin
  for x := 0 to 7 do
    for y := 1 to 14 do begin
      if(bits[pos(ch, st)][y] shr x) and $01 > 0
      then putpixel(px + (7 - x), py + y, 14);
    end;
  inc(px, 10);
end;

procedure PrintString( px, py: integer; s: string; color: byte);
var i: integer;
begin
  for i := 1 to length(s) do
    putChar(px, py, s[i],color);
end;

procedure DrawSpiral(color:byte);
  var t,r:real;
      x,y:integer;
  const r0: real = 0.5;
        r1: real = 0.15;
        x0: integer = 160;
        y0: integer = 100;
begin
  t:=0;
  while t<=11*pi do
  begin
    r:=r0*exp(r1*t);
    x:=x0+round(r*cos(t));
    y:=y0+round(r*sin(t));
    PutPixel(x,y,color);
    t:=t+0.001;
  end;
end;


const figureName:string = 'BERNULLI''S SPIRAL';

begin
asm
  mov ax,13h
  int 10h
end;


DrawSpiral(10);

st:='ABCDEFGHIJKLMNOPQRSTUVWXYZ ''';
PrintString(70,25,figureName,13);

ReadLn;
end.

Результат:

Спираль Бернулли

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

1. Методичка по компьютерной графике - Скачать [.RAR / 66,5 МБ]
2. Задания к лабораторным - Скачать [.JPG / 1,89 МБ]
3. Дистрибутив Turbo Pascal 7 - Скачать 

Все вопросы - в камменты.

Комментарии

Sk
Постов: 1
Comment
Re: [Комп. граф.] Лабораторная работа №1, Вариант №№39, 40
Комментарий #1 от : Fri April 13, 2012, 22:31:23
Кто в теме - тот поймет. Возможно...

Оставь каммент, блеять

  • Рядом с обязательными полями стоит символ «*».

If you have trouble reading the code, click on the code itself to generate a new random code.
 



Как выбрать окна - новости. . Прыгать на диваны киев - нельзя.