bresenham.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * bresenham.h
  3. *
  4. * Copyright (c) 2013 by Oleg Trifonov <otrifonow@gmail.com>
  5. *
  6. * Created on: Mar 20, 2013
  7. *
  8. * http://trolsoft.ru/ru/articles/bresenham-algo
  9. *
  10. * This file is free software; you can redistribute it and/or modify
  11. * it under the terms of either the GNU General Public License version 2
  12. * or the GNU Lesser General Public License version 2.1, both as
  13. * published by the Free Software Foundation.
  14. */
  15. #ifndef _BRESENHAM_H_
  16. #define _BRESENHAM_H_
  17. #include <stdbool.h>
  18. /**
  19. * Структура хранит информацию о настройках и текущем состоянии
  20. * генератора последовательности Брезенхэма.
  21. */
  22. typedef struct {
  23. uint8_t size;
  24. uint8_t value;
  25. int16_t error;
  26. uint8_t stepNumber;
  27. } bresenham_t;
  28. /**
  29. * Метод вызывается в момент инициализации и задаёт количество
  30. * разбиений оси времени (количество градаций яркости).
  31. */
  32. void bresenham_Init(bresenham_t *st, uint16_t bsize)
  33. {
  34. st->size = bsize;
  35. }
  36. /**
  37. * Метод вызывается для задания яркости.
  38. * Например, если size = 100, то val может быть от 0..99.
  39. */
  40. void bresenham_setValue(bresenham_t *st, uint16_t val)
  41. {
  42. st->stepNumber = 0;
  43. st->value = val;
  44. st->error = st->size / 2;
  45. }
  46. /**
  47. * Метод вызывается периодически по прерыванию таймера
  48. * (или любым другим способом) и возвращает true, если надо подать
  49. * положительный импульс и false в противном случае.
  50. */
  51. bool bresenham_getNext(bresenham_t *st)
  52. {
  53. bool result;
  54. st->error -= st->value;
  55. if ( st->error < 0 ) {
  56. st->error += st->size;
  57. result = true;
  58. } else {
  59. result = false;
  60. }
  61. if ( ++st->stepNumber >= st->size) {
  62. st->stepNumber = 0;
  63. st->error = st->size/2;
  64. }
  65. return result;
  66. }
  67. #endif // _BRESENHAM_H_