вывод рисунка с некоторыми дефектами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
фыва
незнакомец
Сообщения: 5
Зарегистрирован: 23.11.2008 22:57:57

вывод рисунка с некоторыми дефектами

Сообщение фыва »

Запукаю программу в FPC, программа должна рисовать 2 графика... и она их рисует, НО местами идут полосы, в которых ничего не отображается... т.е. представьте себе: график начерчен нормально, а потом мы берём в руки стирашку и стираем в некоторых местах...и получаем то что у меня на экране...
Если дололнительно задать программе нарисовать простую линию в областях "протёртых стирашкой" , то прога её там нарисует... но графики не хочет в этих областях отображать...
Причём обидно то, что пробовал у приятеля запускать свою программу на том же FPC и у него всё работает как надо...
Кто-нибудь знает как мне избавиться от этого глюка и глюк ли это вообще :?:
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Программу в студию. Скорее всего глюк в самой программе, учитывая, что отдельные линии всёже рисуются.
фыва
незнакомец
Сообщения: 5
Зарегистрирован: 23.11.2008 22:57:57

Сообщение фыва »

Код: Выделить всё

program oo;
uses crt, graph;

 const
  gamma=0.0;
  w0=1;
  n=1000;
  dt=0.01;
 var
 fi,v,a0,t,E,E0,fi0,v0,fi_n,v_n,fi1,v1:extended;
 i,gd,gm: integer;


 function fun(v,fi:extended):extended;
   begin
 fun:=-2*gamma*v-sqr(w0)*sin(fi);
   end;


 begin

     gd:=detect;
     initgraph(gd,gm, '');
     v:=1;fi:=1;t:=0;E0:=sqr(v)/2-sqr(w0)*cos(fi);

   repeat
    fi0:=fi;v0:=v;a0:=fun(v0,fi0);
  {  fi:=fi+v*dt;
    v:=v+a0*dt;      }

    fi1:=fi+v*dt;
    v1:=v+fun(v,fi)*dt;
    fi_n:=fi+dt*(v+v1)/2;
    v_n:=v+dt/2*(fun(v,fi)+fun(v1,fi1));
    fi:=fi_n;
    v:=v_n;

    E:=sqr(v)/2-sqr(w0)*cos(fi);
    t:=t+dt;

     line(320,0,320,480);
    line(0,240,640,240);

    putpixel(320+trunc(fi*100),240-trunc(v*100), green);
    putpixel(320+trunc(t*5),240-trunc((E/E0-1)*500000), red);

   until keypressed;

   readln;
 end.

модератор: учимся использовать тег code
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Так она и должна с разрывами рисовать при быстром изменении значения функции, график-то рисуется точками.
Рисовать графики стоит не одновременно, а сначала полностью один, затем другой. Это позволит использовать LineTo вместо PutPixel. Разрывы будут исключены. Можно рисовать и одновременно оба, но для каждой функции надо будет помнить предыдущее значение и использовать Line для рисования.

Добавлено спустя 31 минуту 42 секунды:
Вот немного переделал:

Код: Выделить всё

program oo;
uses crt, graph;
const
  gamma=0.0;
  w0=1;
  n=1000;
  dt=0.01;
var
  fi,v,a0,t,E,E0,fi0,v0,fi_n,v_n,fi1,v1:extended;
  i,gd,gm: integer;
  xa,ya,xb,yb,x,y: integer;
  first: boolean;

function fun(v,fi:extended):extended;
begin
  fun:=-2*gamma*v-sqr(w0)*sin(fi);
end;

begin
  gd:=detect;
  initgraph(gd,gm, '');
  v:=1;fi:=1;t:=0;E0:=sqr(v)/2-sqr(w0)*cos(fi);
  first:=true;

  repeat
    fi0:=fi;v0:=v;a0:=fun(v0,fi0);
    { fi:=fi+v*dt;
    v:=v+a0*dt; }

    fi1:=fi+v*dt;
    v1:=v+fun(v,fi)*dt;
    fi_n:=fi+dt*(v+v1)/2;
    v_n:=v+dt/2*(fun(v,fi)+fun(v1,fi1));
    fi:=fi_n;
    v:=v_n;

    E:=sqr(v)/2-sqr(w0)*cos(fi);
    t:=t+dt;

    if first then
     begin
       line(320,0,320,480);
       line(0,240,640,240);
       xa:=320+trunc(fi*100);
       ya:=240-trunc(v*100);
       xb:=320+trunc(t*5);
       yb:=240-trunc((E/E0-1)*500000);
       first:= false;
       continue
     end;

    x:=320+trunc(fi*100);
    y:=240-trunc(v*100);
    setcolor(green); line(xa,ya,x,y);
    xa:=x; ya:=y;

    x:=320+trunc(t*5);
    y:=240-trunc((E/E0-1)*500000);
    Setcolor(red); line(xb,yb,x,y);
    xb:=x; yb:=y;

until keypressed;

readln;
end.

Советую посмотреть ещё здесь viewtopic.php?f=1&t=2053
фыва
незнакомец
Сообщения: 5
Зарегистрирован: 23.11.2008 22:57:57

Сообщение фыва »

Запускал твою программу, но всё происходит по-старому...полосы не исчезают...((((
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Скриншот покажи. И чем компилишь FPC или Turbo Pascal?
фыва
незнакомец
Сообщения: 5
Зарегистрирован: 23.11.2008 22:57:57

Сообщение фыва »

http://radikal.ru/F/s44.radikal.ru/i104 ... f.jpg.html
это вывод
http://s39.radikal.ru/i084/0811/fd/09e3688d3b64.jpg
это окно появляется после



компелирую FTP
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Да, странный вид. А если попробовать перенести на другой компьютер уже откомпилированную программу, что бы определиться с источником проблемы: компилятор или железо/операционная система. И ещё странно что оси координат нарисованы поверх графиков, если это вариант предложенный мной, то графики должны быть поверх осей нарисованы.

Добавлено спустя 13 минут 6 секунд:
То окно появляется возможно по той причине, что рано или поздно в программе происходит переполнение, т.к. она наращивает значение переменных до нажатия клавиши. Ограничить бы надо количество интераций, например заменой "until keypressed" на "until xb>2000"

Добавлено спустя 9 минут 45 секунд:
А что вообще должна нарисовать эта программа? Мне просто непонятен смысл тех вычислений, может можно сделать всё иначе.
фыва
незнакомец
Сообщения: 5
Зарегистрирован: 23.11.2008 22:57:57

Сообщение фыва »

я же говорил что у моего приятеля(у него такой же компьютер, такая же винда, такая же версия FPC) программа работает исправно, и не рисует подобное... В том то и парадокс что у нас с ним всё тоже самое по части железа, винды, компилятора...

а вообще графики - это фазовый портрет( угла от угл скорости) для свободных незатухающих колебаний(диффур 2го порядка). метод Эйлера-Кронера
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Я имел в виду не компилировать на другом компьютере, а откомпилировать на одном, а запускать на другом. Например возможны различия в настройках FPC.

А двух абсолютно одинаковых компьютеров не бывает хотябы потому, что винда при инсталляции использует генератор случайных чисел :)
пупсиГ
незнакомец
Сообщения: 2
Зарегистрирован: 20.12.2008 15:31:11

Сообщение пупсиГ »

а у меня не работает эта программа и выдает ошибку Error 116: Must be in 8087 mode to compile this. :((((( что делать????
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Я так понимаю, что это в Turbo Pascal выдаёт? Тогда надо разрешить использование математического сопроцессора добавив в самом начале программы директивы компилятора {$N+,E+}. Если не планируется запускать эту программу на компьютерах с процессором ниже Pentium, то можно {$N+,E-}
пупсиГ
незнакомец
Сообщения: 2
Зарегистрирован: 20.12.2008 15:31:11

Сообщение пупсиГ »

это во фри паскале :)
Ответить