12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /*
- * bresenham.h
- *
- * Copyright (c) 2013 by Oleg Trifonov <otrifonow@gmail.com>
- *
- * Created on: Mar 20, 2013
- *
- * http://trolsoft.ru/ru/articles/bresenham-algo
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of either the GNU General Public License version 2
- * or the GNU Lesser General Public License version 2.1, both as
- * published by the Free Software Foundation.
- */
- #ifndef _BRESENHAM_H_
- #define _BRESENHAM_H_
- #include <stdbool.h>
- /**
- * Структура хранит информацию о настройках и текущем состоянии
- * генератора последовательности Брезенхэма.
- */
- typedef struct {
- uint8_t size;
- uint8_t value;
- int16_t error;
- uint8_t stepNumber;
- } bresenham_t;
- /**
- * Метод вызывается в момент инициализации и задаёт количество
- * разбиений оси времени (количество градаций яркости).
- */
- void bresenham_Init(bresenham_t *st, uint16_t bsize)
- {
- st->size = bsize;
- }
- /**
- * Метод вызывается для задания яркости.
- * Например, если size = 100, то val может быть от 0..99.
- */
- void bresenham_setValue(bresenham_t *st, uint16_t val)
- {
- st->stepNumber = 0;
- st->value = val;
- st->error = st->size / 2;
- }
- /**
- * Метод вызывается периодически по прерыванию таймера
- * (или любым другим способом) и возвращает true, если надо подать
- * положительный импульс и false в противном случае.
- */
- bool bresenham_getNext(bresenham_t *st)
- {
- bool result;
- st->error -= st->value;
- if ( st->error < 0 ) {
- st->error += st->size;
- result = true;
- } else {
- result = false;
- }
- if ( ++st->stepNumber >= st->size) {
- st->stepNumber = 0;
- st->error = st->size/2;
- }
- return result;
- }
- #endif // _BRESENHAM_H_
|