From 0c2b45dbd5b3e6ba9007a08853baf957a803c8b1 Mon Sep 17 00:00:00 2001
From: Joel Bodenmann <joel.bodenmann@hevs.ch>
Date: Wed, 24 Oct 2012 21:05:23 +0200
Subject: graph update

---
 include/graph.h |  26 +++++++-----
 src/graph.c     | 125 ++++++++++++++------------------------------------------
 2 files changed, 46 insertions(+), 105 deletions(-)

diff --git a/include/graph.h b/include/graph.h
index e027c4ef..74b85ed4 100644
--- a/include/graph.h
+++ b/include/graph.h
@@ -24,28 +24,32 @@
 #if GFX_USE_GRAPH
 
 typedef struct _Graph {
-	coord_t x0;
-	coord_t y0;
-	coord_t x1;
-	coord_t y1;
+	coord_t origin_x;
+	coord_t origin_y;
+	int xmin;
+	int xmax;
+	int ymin;
+	int ymax;
 	uint16_t grid_size;
 	uint16_t dot_space;
 	bool_t full_grid;
+	bool_t arrows;
 	color_t axis_color;
 	color_t grid_color;
+
+	/* do never modify values below this line manually */
+	coord_t x0;
+	coord_t x1;
+	coord_t y0;
+	coord_t y1;
 } Graph;
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-void graphDrawOneQuadrat(Graph *g);
-void graphDrawFourQuadrants(Graph *g);
-void graphDrawDot(coord_t x, coord_t y, uint16_t radius, color_t color);
-void graphDrawDots(int coord[][2], uint16_t entries, uint16_t radius, uint16_t color);
-void graphDrawNet(int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor);
-
-point_t graphGetOrigin(void);
+void graphDrawSystem(Graph *g);
+void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color);
 
 #ifdef __cplusplus
 }
diff --git a/src/graph.c b/src/graph.c
index bac6990a..272fa65d 100644
--- a/src/graph.c
+++ b/src/graph.c
@@ -25,16 +25,6 @@
 
 #if GFX_USE_GRAPH
 
-static point_t origin;		// origin of graph
-
-static void swapCoordinates(coord_t *a, coord_t *b) {
-	coord_t temp;
- 
-	temp = *b;
-	*b = *a;
-	*a = temp;   
-}
-
 static void _horizontalDotLine(coord_t x0, coord_t y0, coord_t x1, uint16_t space, color_t color) {
 	uint16_t offset = x0;
 	uint16_t count = ((x1 - x0) / space);
@@ -55,104 +45,51 @@ static void _verticalDotLine(coord_t x0, coord_t y0, coord_t y1, uint16_t space,
 	} while(count--);
 }
 
-void graphDrawOneQuadrant(Graph *g) {
-	if(g->x0 > g->x1)
-		swapCoordinates(&g->x0, &g->x1);
-	if(g->y0 > g->y1)
-		swapCoordinates(&g->y0, &g->y1);
-
+void graphDrawSystem(Graph *g) {
 	uint16_t i;
-	uint16_t length_x = (g->x1 - g->y0);
-	uint16_t length_y = (g->y1 - g->y0);
-    uint16_t middle_x = (g->x1 - g->x0) / 2;
-    uint16_t middle_y = (g->y1 - g->y0) / 2;
-
-	origin.x = g->x0;
-	origin.y = g->y1;
-
-    /* X Axis */
-    gdispDrawLine(g->x0, g->y1, g->x1, g->y1, g->axis_color);
-	if(g->grid_size > 0)
-		for(i = 0; i <= (length_y / g->grid_size); i++)
-    	    _horizontalDotLine(g->x0, g->y0 + g->grid_size * i, g->x1, g->dot_space, g->grid_color);
-
-    /* Y Axis */
-    gdispDrawLine(g->x0, g->y0, g->x0, g->y1, g->axis_color);
-	if(g->grid_size > 0);
-		for(i = 0; i <= (length_x / g->grid_size); i++)
-    	    _verticalDotLine(g->x0 + g->grid_size * i, g->y0, g->y1, g->dot_space, g->grid_color);		
-}
-
-void graphDrawFourQuadrants(Graph *g) {
-	if(g->x0 > g->x1)
-		swapCoordinates(&g->x0, &g->x1);
-	if(g->y0 > g->y1)
-		swapCoordinates(&g->y0, &g->y1);
 
-	uint16_t i;
-	uint16_t middle_x = (g->x1 - g->x0) / 2;
-	uint16_t middle_y = (g->y1 - g->y0) / 2;
-
-	origin.x = middle_x;
-	origin.y = middle_y;
+	g->x0 = g->origin_x - abs(g->xmin);
+	g->x1 = g->origin_x + abs(g->xmax);
+	g->y0 = g->origin_y + abs(g->ymin);
+	g->y1 = g->origin_y - abs(g->ymax);
 
 	/* X - Axis */
-	gdispDrawLine(g->x0, middle_y, g->x1, middle_y, g->axis_color);
-	
-	/* draw X - Grid ? */
-	if(g->grid_size > 0) {
-		for(i = 1; i <= (middle_y / g->grid_size); i++) {
-			if(g->grid_size + g->grid_size * i <= middle_y)
-				_horizontalDotLine(g->x0, middle_y - g->grid_size * i, g->x1, g->dot_space, g->grid_color);
-			if(g->grid_size * i <= middle_y)
-				_horizontalDotLine(g->x0, middle_y + g->grid_size * i, g->x1, g->dot_space, g->grid_color);
+	gdispDrawLine(g->x0, g->origin_y, g->x1, g->origin_y, g->axis_color);
+	if(g->arrows) {
+		gdispDrawLine(g->x1, g->origin_y, g->x1-5, g->origin_y+5, g->axis_color);
+		gdispDrawLine(g->x1, g->origin_y, g->x1-5, g->origin_y-5, g->axis_color);
+	}
+	if(g->full_grid) {
+		for(i = 1; i <= ((g->origin_y - g->y1) / g->grid_size); i++) {
+			_horizontalDotLine(g->x0, g->origin_y - g->grid_size * i, g->x1, g->dot_space, g->grid_color);
+		}
+		for(i = 1; i <= ((g->y0 - g->origin_y) / g->grid_size); i++) {
+			_horizontalDotLine(g->x0, g->origin_y + g->grid_size * i, g->x1, g->dot_space, g->grid_color);
 		}
 	}
 
+
 	/* Y - Axis */
-	gdispDrawLine(middle_x, g->y0, middle_x, g->y1, g->axis_color);
-
-	/* draw Y - Grid ? */
-	if(g->grid_size > 0) {
-		for(i = 1; i <= (middle_x / g->grid_size); i++) {
-			if(g->grid_size + g->grid_size * i <= middle_x)
-				_verticalDotLine(middle_x - g->grid_size * i, g->y0, g->y1, g->dot_space, g->grid_color);
-			if(g->grid_size * i <= middle_x)
-				_verticalDotLine(middle_x + g->grid_size * i, g->y0, g->y1, g->dot_space, g->grid_color);
+	gdispDrawLine(g->origin_x, g->y0, g->origin_x, g->y1, g->axis_color);
+	if(g->arrows) {
+		gdispDrawLine(g->origin_x, g->y1, g->origin_x-5, g->y1+5, g->axis_color);
+		gdispDrawLine(g->origin_x, g->y1, g->origin_x+5, g->y1+5, g->axis_color);
+	}
+	if(g->full_grid) {
+		for(i = 1; i <= ((g->origin_x - g->x0) / g->grid_size); i++) {
+			_verticalDotLine(g->origin_x - g->grid_size * i, g->y1, g->y0, g->dot_space, g->grid_color);
+		}
+		for(i = 1; i <= ((g->x1 - g->origin_x) / g->grid_size); i++) {
+			_verticalDotLine(g->origin_x + g->grid_size * i, g->y1, g->y0, g->dot_space, g->grid_color);
 		}
 	}
 }
 
-void graphDrawDot(coord_t x, coord_t y, uint16_t radius, color_t color) {
+void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color) {
 	if(radius == 0)
-		gdispDrawPixel(origin.x + x, origin.y + y, color);
+		gdispDrawPixel(g->origin_x + x, g->origin_y + y, color);
 	else
-		gdispFillCircle(origin.x + x, origin.y + y, radius, color);
-}
-
-void graphDrawDots(int coord[][2], uint16_t entries, uint16_t radius, uint16_t color) {
-    uint16_t i;
-
-    for(i = 0; i < entries; i++) {
-		if(radius == 0)
-			gdispDrawPixel(coord[i][0] + origin.x, origin.y - coord[i][1], color);
-		else
-        	gdispFillCircle(coord[i][0] + origin.x, origin.y - coord[i][1], radius, color);
-	}
-}
-
-void graphDrawNet(int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor) {
-    uint16_t i;
-
-    for(i = 0; i < entries; ++i)
-        gdispDrawLine(coord[i-1][0] + origin.x, origin.y - coord[i-1][1], coord[i][0] + origin.x, origin.y - coord[i][1], lineColor); 
-    for(i = 0; i < entries; ++i)
-        if(radius != 0)
-            lcdFillCircle(coord[i][0] + origin.x, origin.y - coord[i][1], radius, dotColor);
-}
-
-point_t graphGetOrigin(void) {
-	return origin;
+		gdispFillCircle(g->origin_x + x, g->origin_y + y, radius, color);
 }
 
 #endif /* GFX_USE_GRAPH */
-- 
cgit v1.2.3