Procházet zdrojové kódy

Added Bresenhem algoithm.

Vladimir N. Shilov před 3 roky
rodič
revize
ad997a7952
1 změnil soubory, kde provedl 76 přidání a 0 odebrání
  1. 76 0
      inc/bresenham.h

+ 76 - 0
inc/bresenham.h

@@ -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_