summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorknolax <1339802534.kk@gmail.com>2018-02-22 08:24:05 -0500
committerknolax <1339802534.kk@gmail.com>2018-02-22 08:24:05 -0500
commitdfe85bc6a74b03fafc90fae74b34eb918b15ff13 (patch)
treeffe1623bba87a5aabd3793483447cb381a07948a
parentf7c187c77071586f162ec3cc80ef0db88a42c313 (diff)
added line drawing
-rw-r--r--wsim.c73
1 files changed, 72 insertions, 1 deletions
diff --git a/wsim.c b/wsim.c
index b369b9d..cfaa089 100644
--- a/wsim.c
+++ b/wsim.c
@@ -123,6 +123,71 @@ void setpixel(uint8_t x, uint8_t y,uint8_t set) {
}
return;
}
+/*takes two points and draws a line between them, dot specifies that every nth x
+ * point be drawn, if dot != 1, then a dotted line is drawn
+ */
+void drawline(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t dot) {
+ /*temporary x and y for switching x1,y1 and x2,y1 if x1>x2*/
+ uint8_t tv;
+ /*number of x values to translate*/
+ uint8_t dx;
+ /*number of y values to translate*/
+ uint8_t dy;
+ /* for whether dy should be positive or negative, 1 pos, 0 neg*/
+ uint8_t dir;
+ /*drawin index*/
+ uint8_t xi = 0;
+ /*makes sure that x1 < x2, otherwise switch them arround*/
+ if (x1 > x2) {
+ tv = x1;
+ x1 = x2;
+ x2 = tv;
+ tv = y1;
+ y1 = y2;
+ y2 = tv;
+ }
+ dx = x2 - x1;
+ /*find absolute
+ * dir is used since i'm planning to port to a platform that may not
+ * have signed ints.
+ */
+ if (y1 > y2) {
+ dir = 0;
+ dy = y1 - y2;
+ } else {
+ dir = 1;
+ dy = y2 - y1;
+ }
+ /*
+ *For vertical Lines
+ * Uses xi as a y index now
+ */
+ if (x1 == x2) {
+ while (xi <= dy) {
+ if (dir) {
+ setpixel(x1, y1 + xi, 1);
+ } else {
+ setpixel(x1, y1 - xi, 1);
+ }
+ xi++;
+ }
+ }
+ /*
+ * loop through x and draws y in line, dots done with modulus.
+ */
+ while (xi <= (dx)) {
+ if ((xi % dot) == 0) {
+ if (dir) {
+ setpixel(x1 + xi, y1 + ((dy/dx * xi)),1);
+ } else {
+ setpixel(x1 + xi, y1 - ((dy/dx * xi)) ,1);
+ }
+ }
+ xi++;
+ }
+
+ return;
+}
int main (int argc, char * argv[]) {
/*holds keypress*/
char input;
@@ -130,8 +195,14 @@ int main (int argc, char * argv[]) {
memset(map, 0, sizeof(map[0][0]) * 100 * 50);
printmap();
while (state & STATE_LOOP) {
- setpixel(0,0,2);
+ setpixel(10,20,2);
+ drawline(0,0,20,20,1);
+ drawline(0,40,10,20,1);
+ drawline(10,50,0,40,2);
+ drawline(10,0,10,200,1);
+ drawline(10,100,100,100,4);
printmap();
+
/* checks input*/
input = getc(stdin);
/*haven't set the terminal to raw mode so will still need