Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2009, 13:09   #1
Diamond2107
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 76
Печаль Паскаль. Задача на графику..помогите доделать((

Здравствуйте. Мне нужно нарисовать кораблик, который двигался бы по синусоиде..вот кораблик вроде сделала, разобралась, но он плывет по прямой..и то коряво..помогите пожалуйста..подскажите что не так..
[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.]
Diamond2107 вне форума Ответить с цитированием
Старый 17.05.2009, 16:09   #2
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
По умолчанию

Вот пример исправленного кода, но данному алгоритму работает очень долго.
Код:
program s1;
uses graph, crt;
var
 grDriver, grMode, ErrCode, i: Integer;
 n: char;

procedure korablik(x, y, color : integer);
begin
 setfillstyle(1, color);
 line(x+100, y, x, y);
 line(x, y, x-20, y-40);
 line(x+100, y, x+110, y-40);
 line(x-20, y-40, x+110, y-40);
 rectangle(x+90, y-90, x+60, y-40);
 rectangle(x+40, y-70, x+25, y-40);
 floodfill(x+1, y-1, white);
 floodfill(x+26, y-41, white);
 floodfill(x+61, y-41, white);
end;

procedure antikorablik(x, y, color : integer);
begin
 setcolor(color);
 setfillstyle(1, color);
 line(x+100, y, x, y);
 line(x, y, x-20, y-40);
 line(x+100, y, x+110, y-40);
 line(x-20, y-40, x+110, y-40);
 rectangle(x+90, y-90, x+60, y-40);
 rectangle(x+40, y-70, x+25, y-40);
 floodfill(x+1, y-1, color);
 floodfill(x+26, y-41, color);
 floodfill(x+61, y-41, color);
 setcolor(white);
end;

begin
 grDriver := Detect;
 InitGraph(grDriver, grMode,' ');
 ErrCode := GraphResult;
 if ErrCode = grOk then
  begin
   korablik(500,240,9);
   moveto(0, 245);
   for i:=0 to 640 do
    begin
     lineto(i, round(2*sin(i*0.2))+245);
    end;
   setfillstyle(1, blue);
   floodfill(1, 1, white);
   setfillstyle(1, cyan);
   floodfill(1, 250, white);
   while n<>#27 do
    begin
     n:=readkey;
     if n=' ' then
      begin
       for i:=0 to 400 do
        begin
         if i>0 then
          antikorablik(500-(i-1), round(2*sin((i-1)*0.2))+240, blue);
         korablik(500-i, round(2*sin(i*0.2))+240, 9);
        end;
      end;
    end;
   CloseGraph;
  end
 else
  Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end.
ася: тристадевяносто 068 ноль восемь шесть
Jora_Kornev вне форума Ответить с цитированием
Старый 17.05.2009, 16:58   #3
Diamond2107
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 76
По умолчанию

Да, все само собой работает)) спасибо за помощь))
Diamond2107 вне форума Ответить с цитированием
Старый 17.05.2009, 16:59   #4
Diamond2107
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 76
По умолчанию

А можно к вам еще обратиться. У меня задача такая, нужно нарисовать землю и вращающуюся вокруг нее луну, при чем так фто бы луна пересекала землю сзади. Ну вот они у меня движутся, только никак не могу раскрасить и не понимаю как сделать так фто бы луна пересекала землю, но изображение земли при этом не повреждалось..
[uses graph, crt;
const a = 300;
b = 230;
r = 150;
r1 =10;
dphi = 2*Pi/72;
n =18;
var grDriver,
grMode,
grErr:integer;
i, x, y:integer;
phi :real;

begin
grDriver:=Detect;
InitGraph(grDriver, grMode,'c:\');
grERR:=graphResult;
if grErr<>grOK then
begin
writeln('ошибка ',graphErrorMsg(grErr));
halt
end;
setcolor(green);
circle( a, b, r div 2 );
phi:= 0;
while not keypressed do
begin
y:=round(R*sin(phi)/2);
x:=round(R*cos(phi));
setcolor(green);
circle(x+a,y+b,R1);

delay(5000);

setcolor( getBkColor );
circle(x+a,y+b,R1);
phi:= phi+dphi;
end;

closegraph;

end]
Diamond2107 вне форума Ответить с цитированием
Старый 17.05.2009, 17:22   #5
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
По умолчанию

хм... надо подумать, напишу - выложу код сюда)
ася: тристадевяносто 068 ноль восемь шесть
Jora_Kornev вне форума Ответить с цитированием
Старый 17.05.2009, 17:28   #6
Diamond2107
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 76
По умолчанию

спасибо, если вам не трудно)
Diamond2107 вне форума Ответить с цитированием
Старый 17.05.2009, 18:03   #7
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
По умолчанию

Вот код, но опять таки не очень быстро работает по такому алгоритму, зато преподаватель сразу поймет что сделано не на стороне)
Код:
uses graph, crt;
const
 a = 300;
 b = 230;
 r = 150;
 r1 =10;
 dphi = 2*Pi/72;
 n =18;
var
 grDriver, grMode, grErr : integer;
 i, x, y : integer;
 phi : real;

begin
 grDriver:=Detect;
 InitGraph(grDriver, grMode,'c:\');
 grERR:=graphResult;
 if grErr<>grOK then
  begin
   writeln('Error ',graphErrorMsg(grErr));
   halt
  end;
 phi:= 0;
 i:=0;
  y:=round(R*sin(phi)/2);
  x:=round(R*cos(phi));
 repeat
  if x<-140 then i:=1;
  if x>140 then i:=0;
  if i=0 then
   begin
    setcolor(getBkColor);
    setfillstyle(1, getBkColor);
    circle(x+a,y+b,R1);
    floodfill(x+a, y+b, getBkColor);
    circle( a, b, r div 2 );
    floodfill(a, b, getBkColor);

    y:=round(R*sin(phi)/2);
    x:=round(R*cos(phi));
    setcolor(green);
    setfillstyle(1, green);
    circle( a, b, r div 2 );
    floodfill(a, b, green);
    setcolor(LightGray);
    setfillstyle(1, LightGray);
    circle(x+a,y+b,R1);
    floodfill(x+a, y+b, LightGray);
    delay(400);
   end else
   begin
    setcolor(getBkColor);
    setfillstyle(1, getBkColor);
    circle(x+a,y+b,R1);
    floodfill(x+a, y+b, getBkColor);
    circle( a, b, r div 2 );
    floodfill(a, b, getBkColor);

    y:=round(R*sin(phi)/2);
    x:=round(R*cos(phi));
    setcolor(LightGray);
    setfillstyle(1, LightGray);
    circle(x+a,y+b,R1);
    floodfill(x+a, y+b, LightGray);
    setcolor(green);
    setfillstyle(1, green);
    circle( a, b, r div 2 );
    floodfill(a, b, green);
    delay(400);
   end;
  phi:= phi+dphi;
 until keypressed;

 closegraph;

end.
ася: тристадевяносто 068 ноль восемь шесть
Jora_Kornev вне форума Ответить с цитированием
Старый 17.05.2009, 18:19   #8
Diamond2107
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 76
По умолчанию

Зато все предельно ясно. Спасибо за помощь))
Diamond2107 вне форума Ответить с цитированием
Старый 17.05.2009, 18:24   #9
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
По умолчанию

обращайтесь)
ася: тристадевяносто 068 ноль восемь шесть
Jora_Kornev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу на графику! Fatality Помощь студентам 3 29.04.2009 19:57
Помогите доделать задачу по паскаль. aleksandr_dss Помощь студентам 3 19.12.2008 10:56
Delphi 7 задача на графику, игрушка Agent[PNZ] Помощь студентам 2 29.04.2008 10:54
паскаль l помогите доделать задачу по одномерн массиву braza Паскаль, Turbo Pascal, PascalABC.NET 15 27.04.2008 14:33
Задача Delphi. Помогите доделать! Oksana11 Помощь студентам 8 27.12.2007 23:00