/* * bresenham.h * * Copyright (c) 2013 by Oleg Trifonov * * 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 /** * Структура хранит информацию о настройках и текущем состоянии * генератора последовательности Брезенхэма. */ 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_