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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2009, 16:07   #1
Richmond_87
 
Регистрация: 05.01.2009
Сообщений: 4
По умолчанию Помогите плиз..работа с графикой(сложная)

Задача заключается в следующем..Надо вывести на экран что-то типа разноцветного солнца, при этом работать должно через EGA драйвер..Вот что я написал, но в EGA не получается перевести...
Код:
uses Graph,crt;
procedure ppix(x,y,c:integer);
var
  sq,off:word;
  but,msk,mc,nb:byte;
  pb:^byte;       i:integer;
begin

 sq:=$A000;
 off:=(x div 8)+y*80;
 nb:=7-(x mod 8);
 pb:=ptr(sq,off);
 msk:=1 SHR nb;
 for i:=0 to 3 do
 begin
   port [$3cf]:=i;
   but:=pb^;
   msk:=1 SHL nb;
   mc:=1 shl i;
 if (c and mc)=0 then
 but:= but AND (NOT msk)
 else
   but:= but OR msk;
   port [$3c5]:=mc;
   pb^:=but;
end;
end;


procedure lin(X1,Y1,X2,Y2,c:integer);
var  Dx,Dy,x,T,y,i:integer;  k,b:real;
begin
  if X1>X2 then
      begin
       T:=X1; X1:=X2; X2:=T;
       T:=Y1; Y1:=Y2; Y2:=T;
      end;
  if (X1=X2) or (Y1=Y2)
    then
      begin
      end
    else
   begin
     k:=(Y2-Y1)/(X2-X1);
     b:=(Y2-Y1)-(k*(X2-X1));
   end;
  if (Y2>Y1) and (X1<>X2) then
    begin
      if K<1 then
        begin
            for x:=X1-320 to x2-320 do
            begin
             y:=round(k*x+b);
             ppix(x+319,y+240,c);
           end;
         end;
      if K>1 then
        begin
         for y:=y1-240 to y2-240 do
            begin
             x:=round((y-b)/k);
             ppix(x+320,y+240,c);
           end;
        end;
      if K=1 then
        begin
				  for x:=X1-320 to x2-320 do
            begin
             ppix(x+320,x+240,c);
            end;
        end;
    end;


    if Y2<Y1 then
    begin
      if K>-1 then
        begin
				  for x:=x1-320 to x2-320 do
            begin
             y:=round(k*x+b);
             ppix(x+319,y+240,c);
            end;
        end;
      if K<-1 then
        begin
				  for y:=y1-240 downto y2-240 do
            begin
             x:=round((y-b)/k);
             ppix(x+320,y+240,c);
           end;
        end;
      if K=-1 then
        begin

				for x:=X1-320 to x2-320 do
           ppix(x+320,-x+240,c);
        end;
    end;

    if X1=X2 then
     begin
       for Y:=Y1 to Y2 do
          begin
            ppix(x1,y,c);
          end;
     end;
   if Y1=Y2 then
      begin
        for x:=x1 to x2 do
          begin
            ppix(x,Y1,c);
          end;
      end;
end;



var
  grDriver,i,j: Integer;     k,c:integer;
  grMode: Integer;
  ErrCode: Integer;
begin
  grDriver := Detect;
  InitGraph(grDriver, grMode,'c:\tp7\bgi');
  ErrCode := GraphResult;   port[$3ce]:=4; port[$3c4]:=2;
  if ErrCode = grOk
   then
    begin port[$3ce]:=4; port[$3c4]:=2;

    for i:=0 to 639 do
    for j:=0 to 479 do
    ppix(i,j,0);

   J:=-10; k:=0;
   for i:=1 to 64 do
     begin
       j:=j+10;k:=k+1;
       lin(j,0,640-j,480,k); if k>15 then k:=0;   delay(1000);
     end;
     j:=-10;
     k:=0;
     for i:=1 to 48 do
     begin
       j:=j+10;  k:=k+1;
       lin(0,480-j,640,j,k); if k>15 then k:=0;   delay(1000);
     end;

Readln;
CloseGraph;
  end
  else
    Writeln('Graphics error:', GraphErrorMsg(ErrCode));
 end.
это только половина кошмара...надо еще уменьшить шаг между лучами, до минимального и запихнуть процедуру цветной линии в каждый луч...т.е. в каждой линии каждый пиксель должен быть разного цвета, от центра и до края дисплея..В итоге должно получаться что-то типа спектра переливающегося...Я конечно понимаю что задача не из легких..но кто сможет помогите хотя бы перевести это в EGA..заранее благодарен..
Richmond_87 вне форума Ответить с цитированием
Старый 07.01.2009, 03:06   #2
Richmond_87
 
Регистрация: 05.01.2009
Сообщений: 4
По умолчанию

перевел я это дело в EGA, уменьшил шаг, вот как дальше быть непойму...чтобы сделать переливающимися точки в линии я так понимаю надо что-то помудрить с палитрами..сделать процедуру переливания цвета через палитру..и как-то вставить её в функцию рисования линии...может кто поможет?????????? а то мозги уж наизнанку не могу понять
Richmond_87 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строкой в С помогите плиз :-) Daedra Помощь студентам 2 25.12.2008 15:48
Работа с графикой kminas Общие вопросы Delphi 5 21.11.2008 00:02
сложная для мну задачка..помогите плиз! лиса Помощь студентам 11 15.01.2007 07:31
Сложная работа Hallo Фриланс 3 09.01.2007 16:19