ПРЕОБРАЗОВАНИЕ КООРДИНАТ. Программирование на Си/С


Добавил:DMT
Дата создания:28 июня 2008, 22:19
Дата обновления:28 июня 2008, 22:49
Просмотров:15385 последний сегодня, 12:57
Комментариев: 0

При изображении плоских объектов возможна ситуация, при которой реальные размеры объектов несовместимы с экранной системой координат. В этом случае, к произвольной прямоугольной плоской области, стороны которой параллельны осям координат, называемой (вещественным) окном, привязывается прямоугольная область экрана - область вывода. В приведенном ниже примере окно ограничено прямыми x=xmin, x=xmax, y=ymin, y=ymax , а областью вывода является весь экран. Точка (xmin, ymin) отображается в нижнем левом углу экрана, а точка (xmax, ymax) - в правом верхнем. Каждому пикселу экрана соответствует прямоугольник в окне, имеющий размеры

, .

Таким образом, координаты пиксела можно вычислить по формулам

, .

При выводе графика функции y=f(x) можно использовать два подхода: построение точечных графиков и построение кусочно-линейных графиков . В первом случае, на экран выводятся точки с координатами (x,y) , где y=f(x) , а во втором случае две соседние точки графика соединяются отрезком прямой. Фактически, во втором случае строится интерполяционный линейный сплайн. Как правило, в первом случае используется функция putpixel , а во втором-функция line . В дальнейшем мы будем строить только кусочно-линейные графики.

Код на C++
  1.  
  2. #include <graphics.h>
  3. #include <math.h>
  4. #include <conio.h>
  5. #include <stdio.h>
  6.  
  7. float xmin, xmax; // Область изменения x
  8. float ymin, ymax; // Область изменения y
  9. float hx; // Шаг
  10. float xdens, ydens;
  11.  
  12.  
  13. // Вычисление экранной x координаты
  14. int ex(float x,float y)
  15. {return (int) ((x-xmin)/xdens);}
  16.  
  17. // Вычисление экранной y координаты
  18. int ey(float x,float y)
  19. {return (int) ((ymax-y)/ydens);}
  20.  
  21. // Функция y=f(x)
  22. float f(float x) {return (float)(x*sin(x));}
  23.  
  24. void main()
  25. {
  26. int graphdriver= DETECT, graphmode, n;
  27. float x,y;
  28.  
  29. // Инициализация графического режима:
  30. initgraph(&graphdriver,&graphmode,"");
  31.  
  32. // Запрос параметров:
  33. gotoxy(40,20);
  34. printf(" Enter please parameter n ");
  35. scanf("%d",&n);
  36. gotoxy(40,21);
  37. printf(" Enter xmin xmax ");
  38. scanf("%f%f",&xmin,&xmax);
  39. gotoxy(40,22);
  40. printf(" Enter ymin ymax ");
  41. scanf("%f%f",&ymin,&ymax);
  42.  
  43. // Очистка области запросов
  44. gotoxy(40,20);
  45. printf(" ");
  46. gotoxy(40,21);
  47. printf(" ");
  48. gotoxy(40,22) ;
  49. printf(" ");
  50. xdens=(xmax-xmin)/getmaxx(); //Вычисление коэффициента масштабирования по x
  51. ydens=(ymax-ymin)/getmaxy(); //Вычисление коэффициента масштабирования по y
  52. hx=(xmax-xmin)/n; // Вычисление шага
  53. setcolor(LIGHTGRAY); // Установка цвета для вывода осей
  54. line(ex(xmin,0), ey(xmin,0), ex(xmax,0), ey(xmax,0)); // Вывод оси X
  55. line(ex(0,ymax), ey(0,ymax), ex(0,ymin), ey(0,ymin)); // Вывод оси Y
  56. gotoxy(39,2); printf("Y"); // Вывод подписи оси Y
  57. gotoxy(78,16); printf("X"); // Вывод подписи оси X
  58. gotoxy(39,16); printf("0"); // Вывод 0 в начале координат
  59.  
  60. // Вывод стрелок
  61. line(ex(0,ymax),ey(0,ymax),ex(0,ymax)-3,ey(0,ymax)+8);
  62. line(ex(0,ymax),ey(0,ymax),ex(0,ymax)+3,ey(0,ymax)+8);
  63. line(ex(xmax,0),ey(xmax,0),ex(xmax,0)-8,ey(xmax,0)+3);
  64. line(ex(xmax,0),ey(xmax,0),ex(xmax,0)-8,ey(xmax,0)-3);
  65. setcolor(WHITE); // Установка цвета для графика функции
  66.  
  67. // Вывод графика функции x*sin(x)
  68. for(x=xmin;x<xmax;x+=hx)
  69. line(ex(x,f(x)),ey(x,f(x)), ex(x+hx, f(x+hx)), ey(x+hx, f(x+hx)));
  70. gotoxy (1 , 1); printf("function x*sin(x)"); // Вывод подписи
  71. getch(); // Ожидание нажатия любой клавиши
  72. closegraph (); // Выход из графического режима
  73. }
  74.  
При использовании обязательна ссылка на http://DMTSoft.ru
up