IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Паскаль. Задача на графику..помогите доделать((
Diamond
сообщение 17.05.2009 12:09
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Женский
Реальное имя: Анастасия

Репутация: -  0  +


Здравствуйте. Мне нужно нарисовать кораблик, который двигался бы по синусоиде..вот кораблик вроде сделала, разобралась, но он плывет по прямой..и то коряво..помогите пожалуйста..подскажите что не так..
program 1; 
uses graph, crt;
var
grDriver, grMode, ErrCode, i: Integer;
n: char;
p: fillpatterntype;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,' ');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
while n<>#27 do
begin
setbkcolor(9);
line(600, 240, 500, 240);
line(500, 240, 480, 200);
line(600, 240, 610, 200);
line(480, 200, 610, 200);
rectangle(590, 150, 560, 200);
rectangle(540, 170, 525, 200);
moveto(10, 245);
for i:=0 to 640 do
begin
lineto(i, round(2*sin(i*0.2))+245);
end;
getfillpattern(p);
setfillpattern(p, 1);
floodfill(480, 300, white);
setfillpattern(p, 3);
floodfill(1, 1, 15);
n:=readkey;
if n=' ' then
begin
for i:=0 to 520 do
begin
line(600-i, 240, 500-i, 240);
line(500-i, 240, 480-i, 200);
line(600-i, 240, 610-i, 200);
line(480-i, 200, 610-i, 200);
rectangle(590-i, 150, 560-i, 200);
rectangle(540-i, 200, 575-i, 200);
setcolor(black);
line(600-i, 240, 500-i, 240);
line(500-i, 240, 480-i, 200);
line(600-i, 240, 610-i, 200);
line(480-i, 200, 610-i, 200);
rectangle(590-i, 150, 560-i, 200);
rectangle(540-i, 200, 575-i, 200);
end;
end;
end;
CloseGraph;
end
else
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.05.2009 10:13
Сообщение #2


Гость






Ну, смотри, вот одна из возможных реализаций:
   setfillstyle(solidfill, blue); { рисуем Землю }
fillellipse(a, b, R div 2, R div 2);
setcolor(white);
circle(a, b, R div 2);

phi:= 0;
while not keypressed do
begin
y:=round(R*sin(phi)/2);
x:=round(R*cos(phi));

setfillstyle(solidfill, lightgray); { рисуем Луну }
fillellipse(x+a, y+b, R1, R1);

if y < 0 then begin { если Y < 0, а следовательно, Земля закрывает Луну }
setfillstyle(solidfill, blue); { , то поверх только что нарисованной Луны перерисовываем Землю }
fillellipse(a, b, R div 2, R div 2);
setcolor(white);
circle(a, b, R div 2);
end;

delay(75);

setcolor(getbkcolor); { а теперь затираем изображение луны, для чего }
setfillstyle(solidfill, getbkcolor); { рисуем цветом фона чуть бОльший круг }
fillellipse(x+a, y+b, R1+2, R1+2);

setfillstyle(solidfill, blue); { и, поскольку, изображение Земли тоже могла пострадать, }
fillellipse(a, b, R div 2, R div 2); { перерисовываем и ее... }
setcolor(white);
circle(a, b, R div 2);

phi:= phi+dphi;
end;
Но у этого способа есть небольшой недостаток: он будет мерцать. Чтобы избавиться от мерцания придется несколько усложнить программу, скажем перейти на многостраничную графику: на одной странице рисуем, другую в этот момент показываем, потом переключаемся на уже отрисованное (страница обновляется за один проход луча, мерцания не видно). Примеры таких программ посмотри в поиске по форуму, ключевые слова SetVisualPage и SetActivePage.

Можно сделать и без многостраничности: проверять, касается ли Луна Земли (портит ее изображение) или нет. Если нет - то можно не отрисовывать Землю повторно, это уменьшит мерцания. Но когда Луна будет проходить перед Землей или позади нее - мерцание все же останется, поэтому первый способ все-же предпочтительнее.

P.S. Следующий вопрос, если он будет, не относящийся к этим программам, задавай в новой теме...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 14:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"