Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uses DOS;
- var r:registers;
- k,x0,y0,i,j,rad,x,y,x1,x2,h,f:integer;
- a:real;
- c:byte;
- Procedure SetVM;{Установка видеорежима}
- begin
- r.ah:=0;
- r.al:=$13;
- intr($10,r);
- end;
- Procedure PP(x,y:integer;c:byte);{Процедура для установки пикселя напрямую в
- видеопамять}
- begin
- Mem[$a000:y*320+x]:=c;
- end;
- procedure BrezenCircle(x0, y0, r: integer);
- var
- x, y: integer;
- dv, dd, dh: integer;
- procedure sim(x, y: integer); {построить 4 симметричные точки}
- begin
- PP(x0+x, y0+y, 4); {верхняя правая четверть}
- PP(x0+x, y0-y, 4); {нижняя правая четверть}
- PP(x0-x, y0+y, 4); {верхняя левая четверть}
- PP(x0-x, y0-y, 4); {нижняя левая четверть}
- end;
- begin
- k:=10;
- x:=0;
- y:=r;
- while((y>=0)or(x<r)) do {обход идет по верхней правой четверти}
- begin
- sim(x,y);
- dv:=abs(r*r - x*x - (y-1)*(y-1)); {сдвиг на 1 вниз}
- dh:=abs(r*r - (x+1)*(x+1) - y*y); {сдвиг на 1 вправо}
- dd:=abs(r*r - (x+1)*(x+1) - (y-1)*(y-1)); {сдвиг на 1 по диагонали вправо и вниз}
- if(dv<dh) then {если сдвиг вниз ближе к радиусу круга}
- begin
- dec(y);
- {кусочек кода где пытался реализовать}
- { for i:=x-k to (x+k) do
- begin
- sim(i,y);
- if (y mod 2) = 0 then inc(k);}
- end;
- if(dd<dv) then {если сдвиг по диагонали ближе к радиусу круга}
- begin
- inc(x);
- {Тот же самый кусок кода}
- { for i:=x-k to (x+k) do
- begin
- sim(i,y);
- if (y mod 2) = 0 then inc(k);}
- end;
- end
- else {если сдвиг вправо ближе к радиусу круга}
- begin
- inc(x);
- if(dd<dh) then dec(y); {если сдвиг по диагонали ближе к радиусу круга}
- end;
- end;
- end;
- begin
- x0:=160;
- y0:=100;
- a:=0;
- rad:=55;
- h:=20;
- c:=4;
- SetVM;
- BrezenCircle(x0,y0,rad);
- readln;
- end.
Add Comment
Please, Sign In to add comment