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

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

Error. Page cannot be displayed. Please contact your service provider for more details. (26)


Рисование по Брезенхэму

Поиск:
Рисование линии (по Брезенхэму)

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Bresengham line drawing
//  (c) Johna Smith, 1996
//
//  Method description:
//    Determine  dy=(y2-y1), dx=(x2-x1)
//    We plot first point of the line and increase errors of plotting
//    (xerr and yerr) by dx and dy respectively. If the error is greater
//    than largest from dx and dy then we should correct next point and
//    shift it to 1 pixel by that axe where error was too big.
//
//  ! This program is NOT optimized for best performance !
//  To do so don't use putpixel function - change bytes in video memory directly.
//
//////////////////////////////////////////////////////////////////////////////

#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 puts pixel on the screen in (x,y) position using color 'color'
// 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 PutPixel(int x, int y, int color)
{
  putpixel(x,y,color);
}

void BLine(int x1,int y1,int x2, int y2, int color)
{
  int delta_x,delta_y,incx,incy,t,distance;
  int xerr=0,yerr=0;

  // determine dx and dy
  delta_x=x2-x1;
  delta_y=y2-y1;

  // determine steps by x and y axes (it will be +1 if we move in forward
  // direction and -1 if we move in backward direction
  if (delta_x>0) incx=1;
  else if (delta_x==0) incx=0;
  else incx=-1;

  if (delta_y>0) incy=1;
  else if (delta_y==0) incy=0;
  else incy=-1;

  delta_x=abs(delta_x);
  delta_y=abs(delta_y);

  // select largest from deltas and use it as a main distance
  if (delta_x>delta_y) distance=delta_x;
  else distance=delta_y;

  for (t=0;t<=distance+1;t++)
  {
    PutPixel(x1,y1,color);
    // increasing error
    xerr+=delta_x;
    yerr+=delta_y;
    // if error is too big then we should decrease it by changing
    // coordinates of the next plotting point to make it closer
    // to the true line
    if(xerr>distance)
    {
      xerr-=distance;
      x1+=incx;
    }
    if (yerr>distance)
    {
      yerr-=distance;
      y1+=incy;
    }
  }
}

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

  /* examples */
  BLine(0, 0, 640, 480,15);
  BLine(320, 0, 320, 480,10);
  BLine(0, 240, 640, 240,11);
  BLine(0, 480, 640, 0,12);
  BLine(320, 11, 10, 5,13);
  BLine(320, 11, 630, 5,13);

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



Рисование окружности (по Брезенхэму)

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Bresengham circle drawing
//  (c) Johna Smith, 1996
//
//  Method description:
//    In this algorithm all floating point math changed to sequences
//  of additions and substractions. The main idea of this algorithm
//  is to increase x and y by the value of the error between them.
//
//  ! This program is NOT optimized for best performance !
//  To do so don't use putpixel function - change bytes in video memory directly.
//
//////////////////////////////////////////////////////////////////////////////

#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 puts pixel on the screen in (x,y) position using color 'color'
// 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 PutPixel(int x, int y, int color)
{
  putpixel(x,y,color);
}


float const ratio=1.0; // you can change this to draw ellipses

// This function plots points that belongs to the circle
// It recieves offsets from center for the fist quadrant
// and plots symmetrical points in all four quadrants
void plot_circle(int x,int y, int x_center, int y_center, int color)
{
  int x_start,y_start,x_end,y_end,x1,y1;

  // the distanse between start and end can be greater than 1 if ratio!=1
  y_start=y*ratio;
  y_end=(y+1)*ratio;
  x_start=x*ratio;
  x_end=(x+1)*ratio;

  for (x1=x_start;x1<x_end;++x1)
  {
    // plot points in all four quadrants
    PutPixel(x1+x_center,y+y_center,color);
    PutPixel(x1+x_center,y_center-y,color);
    PutPixel(x_center-x1,y+y_center,color);
    PutPixel(x_center-x1,y_center-y,color);
  }

  for (y1=y_start;y1<y_end;++y1)
  {
    // plot points in all four quadrants
    PutPixel(y1+x_center,x+y_center,color);
    PutPixel(y1+x_center,y_center-x,color);
    PutPixel(x_center-y1,x+y_center,color);
    PutPixel(x_center-y1,y_center-x,color);
  }
}

// This is main function that draws circle using function

void Circle(int x1,int y1,int radius, int color)
{
  int x,y,delta;

//     Y    *              we start from * and increase x step by step
//          |              decreasing y when needed
//          |
//          |
// --------------------
//          |         X
//          |
//          |
//          |
  y=radius;
  delta=3-2*radius; // delta is an error
  // calculate values for first quadrant
  for (x=0;x<y;x++) // x is a main axe
  {
    // plot points symmetrically in all quadrants
    plot_circle(x,y,x1,y1,color);
    if (delta<0) delta+=4*x+6;
    else
    {
      delta+=4*(x-y)+10;
      y--; // it's time to decrease y
    }
  }
  x=y;
  if (y!=0) plot_circle(x,y,x1,y1,color);
}

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

  /* examples */
  Circle(200,200,100,14);
  Circle(300,200,100,15);
  Circle(400,200,100,13);
  Circle(250,100,100,12);
  Circle(350,100,100,11);
  Circle(50,400,25,2);
  Circle(500,400,25,2);

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

Сайт: forum.vingrad.ru






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

 

 

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


Популярные:
  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. Проверить дубляжи в столбце


 

 

 
 
На главную