void interactive(char option) { // Number to round float input = 0.0; // Rounding operation to use int opt = option; // Char used for clearing buffer int ch; //Loop infinitely asking user for numbers to round, quitting if they press q at the end while(1) { // Ask the user for a number and parse it into a float printf("\nEnter a number to round >"); scanf("%f",&input); FLUSH; //Don't forget to flush! // If no additonal option specifiers were provided, ask the user for rounding method to use if(option == INTERACTIVE) { printf("Enter u to round up, d to round down, or any key to for swedish rounding >"); opt = getchar(); } // Ensure user entered a valid option, default to swedish rounding if not if(opt != ROUND_UP && opt != ROUND_DOWN) opt = ROUND_SWEDISH; // Print the rounded number printf("%.0f\n",(roundnum(input,opt))); //Ask the user if they wish to quit. Quit if q is supplied printf("Press q to quit or any key to continue > "); if(getchar() == QUIT) return; } }
void TerosCam::drawline (double p1 [3], double p2 [3], char fill, int fg, int bg, int attr) { double snorm = 0; bool swap = false; if (!(p2 [1] >= 0 && p2 [1] <= m_viewcolumns - 1 && p2 [2] >= 0 && p2 [2] <= view.size ()/m_viewcolumns - 1)) { if (p1 [1] >= 0 && p1 [1] <= m_viewcolumns - 1 && p1 [2] >= 0 && p1 [2] <= view.size ()/m_viewcolumns - 1) { double buffer [3]; buffer [0] = p2 [0]; buffer [1] = p2 [1]; buffer [2] = p2 [2]; p2 [0] = p1 [0]; p2 [1] = p1 [1]; p2 [2] = p1 [2]; p1 [0] = buffer [0]; p1 [1] = buffer [1]; p1 [2] = buffer [2]; swap = true; } else { if (p1 [1] - p2 [1] != 0) { double ux = -1; double uy = -1; double dx = -1; double dy = -1; double lx = -1; double ly = -1; double rx = -1; double ry = -1; double up; double dp; double lp; double rp; double m = (p1 [2] - p2 [2])/(p1 [1] - p2 [1]); double b = p1 [2] - p1 [1]*m; if ((view.size ()/m_viewcolumns - 1 - b)/m >= 0 && (view.size ()/m_viewcolumns - 1 - b)/m <= m_viewcolumns - 1) { ux = (view.size ()/m_viewcolumns - 1 - b)/m; uy = view.size ()/m_viewcolumns - 1; } if ((0 - b)/m >= 0 && (0 - b)/m <= m_viewcolumns - 1) { dx = (0 - b)/m; dy = 0; } if (0*m + b >= 0 && 0*m + b <= view.size ()/m_viewcolumns - 1) { lx = 0; ly = 0*m + b; } if ((m_viewcolumns - 1)*m + b >= 0 && (m_viewcolumns - 1)*m + b <= view.size ()/m_viewcolumns - 1) { rx = m_viewcolumns - 1; ry = (m_viewcolumns - 1)*m + b; } up = dist (ux, uy, 0, p2 [1], p2 [2], 0); dp = dist (dx, dy, 0, p2 [1], p2 [2], 0); lp = dist (lx, ly, 0, p2 [1], p2 [2], 0); rp = dist (rx, ry, 0, p2 [1], p2 [2], 0); if (ux != -1 && lx != -1) { if (up < lp) { snorm = up; } else { snorm = lp; } } else if (ux != -1 && dx != -1) { if (up < dp) { snorm = up; } else { snorm = dp; } } else if (ux != -1 && rx != -1) { if (up < rp) { snorm = up; } else { snorm = rp; } } else if (rx != -1 && dx != -1) { if (rp < dp) { snorm = rp; } else { snorm = dp; } } else if (rx != -1 && lx != -1) { if (rp < lp) { snorm = rp; } else { snorm = lp; } } else if (dx != -1 && lx != -1) { if (dp < lp) { snorm = dp; } else { snorm = lp; } } else { return; } } else { if (p2 [1] >= 0 && p2 [1] <= m_viewcolumns - 1) { if (abs(p2 [2] - view.size ()/m_viewcolumns - 1) < abs(p2 [2] - 0)) { snorm = abs(p2 [2] - view.size ()/m_viewcolumns - 1); } else { snorm = abs(p2 [2] - 0); } } } } } double dispx = p1 [1] - p2 [1]; double dispy = p1 [2] - p2 [2]; double normdispxy = dist (dispx, dispy, 0, 0, 0, 0); dispx /= normdispxy; dispy /= normdispxy; for (double norm = snorm; norm < normdispxy; norm += 0.5) { if (getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2])) == -1) { if (swap) { double buffer [3]; buffer [0] = p2 [0]; buffer [1] = p2 [1]; buffer [2] = p2 [2]; p2 [0] = p1 [0]; p2 [1] = p1 [1]; p2 [2] = p1 [2]; p1 [0] = buffer [0]; p1 [1] = buffer [1]; p1 [2] = buffer [2]; } return; } if (((norm/normdispxy)*(p1 [0] - p2 [0])) + p2 [0] > 0 && (((norm/normdispxy)*(p1 [0] - p2 [0])) + p2 [0] < viewdepth [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))] || viewdepth [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))] == -1)) { view [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))].c = fill; view [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))].fg = fg; view [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))].bg = bg; view [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))].attr = attr; viewdepth [getelementindex (roundnum(dispx*norm + p2 [1]), roundnum(dispy*norm + p2 [2]))] = norm/normdispxy*(p1 [0] - p2 [0]) + p2 [0]; } } }