|
@@ -0,0 +1,76 @@
|
|
|
|
+/*
|
|
|
|
+ * 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_
|