Не силен в Паскале, расскажу на словах, для дисплея 15-ИЭ-00хххх.
Нужно нарисовать на экране размером 80х24 символа круг из буковок, используя позиционирование курсора , привязанное к функции Кос и Син.
Вид для печати
в сети никто не "парится" символами - там везде модулем графики окружность рисуют )))
слазил полистал шпоры по построению окружностей, ув. @MM - сжальтесь над Хоботом, пожалуйста.
- - - Добавлено - - -
набросал такое, но конкретно с выводом по координатам проблема, что я не понимаю сам себя )))
Код:PROGRAM MMM;
VAR
X0, Y0: INTEGER; (* ЦЕНТР *)
XR, YR: INTEGER; (* ТОЧКА НА ОКР. *)
RR: INTEGER; (* ВЫЧИСЛЯЕМЫЙ РАДИУС *)
XT,YT: INTEGER; (* ЭКРАННЫЕ КООРДИНАТЫ *)
BEGIN
WRITE(CHR(17B),CHR(27),'H',CHR(27),'J');
X0:=0;Y0:=0;XR:=0;YR:=0;RR:=0;XT:=0;YT:=0;
WRITE('ВВЕДИТЕ КООРДИНАТЫ СЕРЕДИНЫ ОКР. XO, YO >');
READLN(X0,Y0);
WRITE('ВВЕДИТЕ КООРДИНАТЫ ТОЧКИ НА ОКР. XR, YR >');
READLN(XR,YR);
RR:=ROUND(SQRT(SQR(XR-X0)+SQR(YR-Y0)));
FOR XT:=(X0-RR) TO RR*2 DO
FOR YT:=(Y0-RR) TO RR*2 DO
BEGIN
IF ((XT=(X0-RR))OR(XT=(RR*2)))AND((YT=(Y0-RR))OR(YT=(RR*2))) THEN
BEGIN
WRITE(CHR(27),'Y',CHR(32+YT),CHR(32+XT));
WRITE('#':1);
END;
END;
REPEAT UNTIL 0>0;
END.
Набросок
РезультатКод:PROGRAM CIRCLE;
VAR
X0: INTEGER;
Y0: INTEGER;
R: INTEGER;
PROCEDURE PUTPIXEL(X: INTEGER; Y: INTEGER; PIXEL: CHAR);
BEGIN
IF X > 79 THEN X:=79;
IF X < 0 THEN X:=0;
IF Y > 23 THEN Y:=23;
IF Y < 0 THEN Y:=0;
X:=X + 32;
Y:=ROUND(Y/2) + 6 + 32;
WRITE(CHR(27),'Y',CHR(Y),CHR(X), PIXEL);
END;
PROCEDURE PIXELCIRCLE(XC: INTEGER; YC: INTEGER;
DX: INTEGER; DY: INTEGER;
PIXEL: CHAR);
BEGIN
PUTPIXEL(XC+DX, YC+DY, PIXEL);
PUTPIXEL(XC+DY, YC+DX, PIXEL);
PUTPIXEL(XC+DY, YC-DX, PIXEL);
PUTPIXEL(XC+DX, YC-DY, PIXEL);
PUTPIXEL(XC-DX, YC-DY, PIXEL);
PUTPIXEL(XC-DY, YC-DX, PIXEL);
PUTPIXEL(XC-DY, YC+DX, PIXEL);
PUTPIXEL(XC-DX, YC+DY, PIXEL);
END;
PROCEDURE CIRCLE(XC: INTEGER; YC: INTEGER; R: INTEGER; PIXEL: CHAR);
VAR
DX: INTEGER;
DY: INTEGER;
Z: INTEGER;
DD: INTEGER;
BEGIN
DX:=0;
DY:=R;
DD:=2*(1-R);
WHILE DX < DY DO BEGIN
PIXELCIRCLE(XC, YC, DX, DY, PIXEL);
IF DD = 0 THEN BEGIN
DX:=DX+1; DY:=DY-1; DD:=DD+2*(DX-DY+1); END
ELSE BEGIN
Z:=2*DD-1;
IF DD > 0 THEN BEGIN
IF Z+2*DX <= 0 THEN BEGIN
DX:=DX+1; DY:=DY-1; DD:=DD+2*(DX-DY+1); END
ELSE BEGIN
DY:=DY-1; DD:=DD-2*DY+1;
END; END
ELSE BEGIN
IF Z+2*DY > 0 THEN BEGIN
DX:=DX+1; DY:=DY-1; DD:=DD+2*(DX-DY+1); END
ELSE BEGIN
DX:=DX+1; DD:=DD+2*DX+1;
END;
END;
END;
END;
IF DX = DY THEN PIXELCIRCLE(XC, YC, DX, DY, PIXEL);
END;
BEGIN
WRITE('wwedite koordinaty serediny okruzhnosti XO, YO >');
READLN(X0,Y0);
WRITE('wwedite radius okruzhnosti R >');
READLN(R);
WRITE(CHR(17B),CHR(27),'H',CHR(27),'J');
CIRCLE(X0, Y0, R, '.');
REPEAT UNTIL FALSE;
END.
Что требует доработки.Код:
.....
... ...
.. ..
.. ..
. .
. .
. .
. ..
.........
- Более тщательный учёт округления челочисленной арифметики, особенно учитывая небольшой диапазон значений по X и особенно по Y (в наброске проги - не парился)
- Учёт несимметричности экрана по координатам X и Y (квадрат при подходе в лоб будет выглядеть прямоугольником) (в наброске проги - коэффициент 2 для оси Y - реальный коэффициент будет чуть больше двух)
- - - Добавлено - - -
Как выглядит окошко, в котором всё это было нарисовано. Минут за 20 :)
Код:.............................................! !
.............................................! 2!C.LST
C.PAS .......................................! 1!C.PAS
C.BLD .......................................! !C.BLD
C.TSK .......................................! !C.TSK
.............................................! !C.OBJ
.............................................! !
.............................................! !
.............................................! !
.............................................! !USERCCL.CCL
[* КОНЕЦ ТЕКСТА *]
И похоже @MM сильно переживает за размер исполняемого файла
так я же пояснил , что для начала просто по двум точкам попробовал построить цирцле из #
синусы - косинусы - это пока в сторонку было отложено...ибо я с выводом на жкран ничего не получилось.
ну вот, а @MM зачем то понадобился Паскаль )
Да ещё и син , и цос - не я ТЗ писал, мой набросок - это попытка нахрапом символьную окружность построить.
Как и твой, только у меня цикл отрисовки "НЕ РАБОТАЕТ". Повторюсь - копал в форумах, но там все "хитромодные"
все рисуют графмодулем.
У OMSI PASCAL - исполняемый файл на выходе весьма мал. По сравнению с более поздними версиями Паскалей на его основе. В архиве он оформлен как PASDWK.(SAV,OBJ)
Господа хорошие, окружности лучше всего рисовать не синусом и косинусом, а квадратами, даже не выходя на вещ. арифметику.
Код:PROCEDURE Circle (cx, cy, radius: INTEGER);
VAR
x, y, rr, xx, yy: INTEGER;
PROCEDURE Cursors;
BEGIN
PutPixel(cx+x, cy+y); PutPixel(cx-x, cy+y);
PutPixel(cx+x, cy-y); PutPixel(cx-x, cy-y);
PutPixel(cx+y, cy+x); PutPixel(cx-y, cy+x);
PutPixel(cx+y, cy-x); PutPixel(cx-y, cy-x)
END {Cursors};
BEGIN
x := radius; y := 0; rr := x*x; xx := rr-x; yy := 0;
REPEAT
Cursors; INC(yy, y+y+1); INC(y);
IF xx > (rr-yy) THEN BEGIN INC(xx, 1-x-x); DEC(x); Cursors END
UNTIL x < y
END {Circle};
экранные координаты и окружность из символов , только целый тип.
А можешь по ТЗ сочинить? И показать @MM размеры исполняемого файла?
Хотя всегда есть шанс, что "препод", просто оценив старания экзаминующихся, поставит зачёт за половину ответа )))
Лучше предложи как доработать, чтобы программа учитывала разный аспект соотношений сторон, для текстового режима это важно)