Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите с рисованием
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
tim4d
Здраствуйте. нужна небольшая помошь с рисунком,
а именно сделать заливку и дорисовать полукруг снизу.
какими командами это делать не знаю. можно хотя бы их)
программа:
 program int;
uses graph, crt;
var grdriver, grmode, driver, m,n,x,y,z,a,b: integer;
begin
grdriver:=detect;
initgraph (grdriver, grmode, '');
setbkcolor (blue);
b:=1;
repeat
x:=120;y:=100;z:=80;m:=60;n:=40;a:=1700;
if b=1 then

begin
repeat
{korobka}
setcolor (7);
fillellipse (330,365,40,14);
line (290,365,290,390);
line (370,365,370,390);

{svechka}
setcolor (14);
line (310,365,310,x);
line (350,365,350,x);
fillellipse (330,365,20,7);
fillellipse (330,x,20,7);
setcolor (8);
line (330,x,330,y);

{ogon'}
setcolor (4);
line (330,y,340,z);
line (330,y,320,z);
line (330,n,340,z);
line (330,n,320,z);
setcolor (13);
line (330,y,335,z);
line (330,y,325,z);
line (330,m,335,z);
line (330,m,325,z);

{zvyk}
a:=a-7;
sound (a);
delay(1000);
nosound;

x:=x+1;
y:=y+1;
z:=z+1;
m:=m+1;
n:=n+1;

delay(7000);
cleardevice;
until x=360;
end;

setcolor (14);
OutTextXY(20, 40, 'again? yes=1/no=0');
readln (b);
until b=0;
closegraph;
end.

sheka
ellipse
floodfill

Добавлено через 1 мин.
Форматтируй, пожалуйста, код (делай отступы вложености).
tim4d
ellipse
в этой команде 1,2 координата центра
5,6 - крайние точки элипса
а 3,4 значение что значат? как мне полуэлипс сделать?

а понял) это градусы

Спасибо за помошь sheka
volvo
Цитата
дорисовать полукруг снизу.
Прекрасно можно, используя возможности Вьюпортов:

{ Это твой код }
{korobka}
setcolor (7);
fillellipse (330,365,40,14); { Заметил? Радиусы равны соответственно 40 и 14 }
line (290,365,290,390);
line (370,365,370,390);

{ А вот это добавлено мной }
setviewport(0, 391, getmaxx, getmaxy, ClipOn);
fillellipse (330, 0, 40, 14); { Ага, радиусы - те же, что и у тебя }
setviewport(0, 0, getmaxx, getmaxy, ClipOn);
Запусти и посмотри, что получится...

А теперь чуть подробнее, что именно происходит: сначала я устанавливаю вьюпорт (я не знаю приемлемого перевода, некоторые говорят "графическое окно", но мне кажется, что этот термин не очень подходит для данного случая, я предпочитаю называть это именно словом "Вьюпорт") на нижнюю часть экрана, то есть, ниже всего, что у тебя уже было отрисовано, причем последний параметр = True, то есть, все, что выходит за границы установленной области, НЕ БУДЕТ отображаться. А потом я просто рисую обычный эллипс (обрати внимание, все координаты X и Y задаются не относительно всего экрана, а именно относительно границ Вьюпорта, радиусов это не касается. Именно поэтому в FillEllipse параметр Y равен 0. Параметр X не изменился только по той причине, что по ширине границы Вьюпорта совпадают с границами экрана). Но ведь FillEllipse должен рисовать полный эллипс, а отрисовалась только нижняя часть, заметил? Вот именно потому, что Вьюпорт был задан "с отсечением" - все, что находится выше него, просто не отрисовывается.

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

Это было первое. А вот теперь - второе. Я бы на твоем месте попробовал не перерисовывать изображение каждый раз, а нарисовал бы однократно, сохранил бы его в буфер (GetImage), и потом выводил бы в другом месте (PutImage). Воспользуйся поиском, примеры такой анимации уже были на форуме.

Третье - не используй "магические числа". Что за цвет №14 - отвечай сразу, не задумываясь? Что за цвет №12? А №10? Не надо делать работу за компилятор. Пиши Yellow/LightRed/LightGreen, все понятно с первого взгляда.
TarasBer
Не надо писать begin repeat ... until end
Можно просто repeat ... until
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.