Блог : http://collectingrd.kxk.ru/ . В ЛС прошу не писать, все сообщения MMTEMA@MAIL.RU
в сети никто не "парится" символами - там везде модулем графики окружность рисуют )))
слазил полистал шпоры по построению окружностей, ув. @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)
Последний раз редактировалось hobot; 24.12.2020 в 12:40.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Господа хорошие, окружности лучше всего рисовать не синусом и косинусом, а квадратами, даже не выходя на вещ. арифметику.
Код: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};
hobot(25.12.2020)
экранные координаты и окружность из символов , только целый тип.
А можешь по ТЗ сочинить? И показать @MM размеры исполняемого файла?
Хотя всегда есть шанс, что "препод", просто оценив старания экзаминующихся, поставит зачёт за половину ответа )))
Лучше предложи как доработать, чтобы программа учитывала разный аспект соотношений сторон, для текстового режима это важно)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)