Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Сглаживание, затемнение рисунков...

Поиск:
Сглаживание кривой В-сплайном

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Curve fitting using B-splines
//  (c) Johna Smith, 1996
//
//  Method description:
//    We are drawing lines between points using the following formulas:
//    x(t)=((a3*t+a2)*t+a1)*t+a0
//    y(t)=((b3*t+b2)*t+b1)*t+b0
//    t=0..1
//    Look program for formulas for coefficients ai,bi
//    These coefficients depends on coordinates of current point,
//    previous one, next and next-next ones.
//
//////////////////////////////////////////////////////////////////////////////

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

// this function initializes graphics mode
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void init_gr(void)
{
   /* request autodetection */
   int gdriver = DETECT, gmode, errorcode;

   /* initialize graphics mode */
   initgraph(&gdriver, &gmode, "");

   /* read result of initialization */
   errorcode = graphresult();

   if (errorcode != grOk)    /* an error occurred */
   {
      printf("Graphics error: %sn", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);               /* return with error code */
   }
}

// this function shuts graphics mode down
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void end_gr(void)
{
  closegraph();
}

// this function moves CP to (x,y) position
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void MoveTo(int x, int y)
{
  moveto(x,y);
}

// this function draws a line to (x,y) position
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void LineTo(int x, int y)
{
  lineto(x,y);
}

// this function draws a line from (x1,y1) to (x2,y2)
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void Line(int x1, int y1, int x2, int y2)
{
  line(x1,y1,x2,y2);
}


const N=21; // number of points
const M=300.0; // number of steps between two points

// coordinates of all given points
int x[N]={50,25,50,125,200,225,275,475,590,615,615,615,600,475,275,225,200,125,50,25,50};
int y[N]={140,100,60,40,70,90,85,75,80,85,100,115,120,125,115,110,130,160,140,100,60};

// coefficients
float t,xA,xB,xC,xD,yA,yB,yC,yD,a0,a1,a2,a3,b0,b1,b2,b3;
int n,i,j,first;

int main(void)
{
  // initializing graphics mode
  init_gr();

   /* mark the given points */
   for (i=0;i<N;i++)
   {
     Line(x[i]-4,y[i]-4,x[i]+4,y[i]+4);
     Line(x[i]+4,y[i]-4,x[i]-4,y[i]+4);
   }

   /* main loop */
   first=1;
   for(i=1;i<N-2;i++)
   {
     // calculating coefficients
     xA=x[i-1]; xB=x[i]; xC=x[i+1]; xD=x[i+2];
     yA=y[i-1]; yB=y[i]; yC=y[i+1]; yD=y[i+2];
     a3=(-xA+3*(xB-xC)+xD)/6.0;  b3=(-yA+3*(yB-yC)+yD)/6.0;
     a2=(xA-2*xB+xC)/2.0;        b2=(yA-2*yB+yC)/2.0;
     a1=(xC-xA)/2.0;             b1=(yC-yA)/2.0;
     a0=(xA+4*xB+xC)/6.0;        b0=(yA+4*yB+yC)/6.0;
     for (j=0;j<M;j++) // drawing curve between two given points
     {
       t=(float)j/(float)M;
       if (first)
       {
         first=0;
         MoveTo(((a3*t+a2)*t+a1)*t+a0,((b3*t+b2)*t+b1)*t+b0);
       } else LineTo(((a3*t+a2)*t+a1)*t+a0,((b3*t+b2)*t+b1)*t+b0);
     }
   }

   /* clean up */
   getch();
   end_gr();
   
   return 0;
}



Постепенное затемнение

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Fade to black (slowly turning the light off)
//  (c) Johna Smith, 1996
//
//  Method description:
//    We need only to decrease Red, Green and Blue components for each color
//    in palette. For example, if Red component of the first color was
//    initially 60 and we want to turn the light off in 30 steps we should
//    decrease Red component by 60/30=2 by step.
//  To increase productivity of this program you shouldn't use standart
//  BGI functions. Use direct methods instead.
//
//////////////////////////////////////////////////////////////////////////////

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>

// this function initializes graphics mode
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void init_gr(void)
{
   /* request autodetection */
   int gdriver = DETECT, gmode, errorcode;

   /* initialize graphics mode */
   initgraph(&gdriver, &gmode, "");

   /* read result of initialization */
   errorcode = graphresult();

   if (errorcode != grOk)    /* an error occurred */
   {
      printf("Graphics error: %sn", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);               /* return with error code */
   }
}

// this function shuts graphics mode down
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void end_gr(void)
{
  closegraph();
}

// this function set filling style
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void SetFillStyle(int pattern,int color)
{
  setfillstyle(pattern,color);
}

// this function draws a bar
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void Bar(int x1, int y1, int x2, int y2)
{
  bar(x1,y1,x2,y2);
}

// this function sets palette entry using RGB color coding
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void SetRGBPalette(int colornum, int red, int green, int blue)
{
  setrgbpalette(colornum,red,green,blue);
}

// this function reads palette
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void GetPalette(struct palettetype far *palette)
{
  getpalette(palette);
}

#define N    30 // steps of fading to black

struct palettetype pal;
struct {int R;int G;int B;} colors[16];

int main(void)
{
  // initializing graphics mode
  init_gr();

  // creating palette
  GetPalette(&pal);
  for(int i=0;i<pal.size-1;i++)
  {
     colors[i+1].R=0;
     colors[i+1].G=30-2*i;
     colors[i+1].B=15+i*2;
     SetRGBPalette(pal.colors[i+1],colors[i+1].R,colors[i+1].G,colors[i+1].B);
  }

  // drawing picture
  for (i=1;i<16;i++)
  {
     SetFillStyle(SOLID_FILL,i);
     Bar((i-1)*43,0,i*43,479);
  }

  // fading to balck
  for (int j=0;j<N;j++)
  {
     //delay(50);
     for (i=1;i<pal.size;i++)
        SetRGBPalette(pal.colors[i],
   colors[i].R*(1-(float)j/N),
          colors[i].G*(1-(float)j/N),
          colors[i].B*(1-(float)j/N));
  }

  // and back to the light
  for (j=0;j<N;j++)
  {
     //delay(50);
     for (i=1;i<pal.size;i++)
        SetRGBPalette(pal.colors[i],
          colors[i].R*(float)j/N,
          colors[i].G*(float)j/N,
          colors[i].B*(float)j/N);
  }

  /* clean up */
  getch();
  end_gr();

  return 0;
}
Сайт: forum.vingrad.ru






Просмотров: 2352

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную