예제 #1
0
int main(void)
{
  ArPose pose;

  ArLine xLine(-2000, 0, 2000, 0);
  ArLine yLine(100, 500, 100, -500);
  ArLineSegment xLineSeg(-2000, 0, 2000, 0);
  ArLineSegment yLineSeg(100, 500, 100, -500);

  // test all our segments
  testIntersection(&xLine, &yLine, 100, 0, "xLine and yLine");
  testIntersection(&xLineSeg, &yLine, 100, 0, "xLineSeg and yLine");
  testIntersection(&yLineSeg, &xLine, 100, 0, "yLineSeg and xLine");
  testIntersection(&xLineSeg, &yLineSeg, 100, 0, "xLineSeg and yLineSeg");
  

  // test the perp on all the segments
  testPerp(&xLineSeg, ArPose(-2000, 50), ArPose(-2000, 0), "xLineSeg end1");
  testPerp(&xLineSeg, ArPose(2000, 50), ArPose(2000, 0), "xLineSeg end2");
  testPerp(&xLineSeg, ArPose(357, 50), ArPose(357, 0), "xLineSeg middle");
  testNotPerp(&xLineSeg, ArPose(2001, 0), "xLineSeg beyond end2");
  testNotPerp(&xLineSeg, ArPose(3000, 0), "xLineSeg way beyond end2");
  testNotPerp(&xLineSeg, ArPose(-2001, 0), "xLineSeg beyond end1");
  testNotPerp(&xLineSeg, ArPose(-3000, 0), "xLineSeg way beyond end1");
  
  testPerp(&xLineSeg, ArPose(1000, 0), ArPose(1000, 0), "xLineSeg point on line");

  printf("All tests completed successfully\n");

  return 0;
}
예제 #2
0
//
// http://stackoverflow.com/questions/27755514/circle-with-thickness-drawing-algorithm
//
void CircleProgressBar_draw(Adafruit_ILI9341 * _display,  int xc, int yc, int inner, int outer, int16_t backgroundColor, int16_t foregroundColor, float angle)
{
	int xo = outer;
	int xi = inner;
	int y = 0;
	int erro = 1 - xo;
	int erri = 1 - xi;

	while (xo >= y) {

		//
		// BOTTOM LEFT CORNER - WORKS
		//
		if (angle > PI && angle <= 3 * PI / 2)
		{
			// do background
			//xLine(xc - xo, xc - xi, yc + y,  colour);
			//yLine(_display,xc - y,  yc + xi, yc + xo, colour);

			// do foreground
			int xbound = xc - y*tan(angle);
			int ybound = yc + y / tan(angle);

			if ( xbound <= (xc - xo) && xbound <= (xc - xi))
				xLine(_display, xc - xo, xc - xi, yc + y, foregroundColor);

			if (xbound > xc - xi) 
				xLine(_display, xc - xo, xc - xi, yc + y, backgroundColor);

			if (xbound >= (xc - xo) && xbound <= (xc - xi))
			{
				xLine(_display, xc - xo, xbound, yc + y, backgroundColor);
				xLine(_display, xbound, xc - xi, yc + y, foregroundColor);
			}

			if (ybound <= (yc + xo) && ybound <= (yc + xi))
				yLine(_display,xc - y, yc + xi, yc + xo, foregroundColor);

			if (ybound > yc + xo)
				yLine(_display, xc - y, yc + xi, yc + xo, backgroundColor);

			if (ybound <= (yc + xo) && ybound >= (yc + xi))
			{
				yLine(_display, xc - y, yc + xi, ybound, backgroundColor);
				yLine(_display, xc - y, ybound, yc + xo, foregroundColor);
			}
		}
		else
		{
			// do foreground directly
			xLine(_display,xc - xo, xc - xi, yc + y, angle > 3 * PI / 2 ? foregroundColor : backgroundColor);
			yLine(_display,xc - y, yc + xi, yc + xo, angle > 3 * PI / 2 ? foregroundColor : backgroundColor);
		}


		//
		// BOTTOM RIGHT CORNER - WORKS
		//
		if (angle > PI / 2 && angle <= PI)
		{
			// do background
			//xLine(_display,xc + xi, xc + xo, yc + y,  ILI9341_BLUE);
			//yLine(_display,xc + y,  yc + xi, yc + xo, ILI9341_BLUE);

			// do foreground
			int xbound = xc - y*tan(angle);
			int ybound = yc - y / tan(angle); 

			if (xbound <= (xc + xi) && xbound <= (xc + xo))
				xLine(_display,xc + xi, xc + xo, yc + y, foregroundColor);

			if (xbound > xc + xo)
				xLine(_display, xc + xi, xc + xo, yc + y, backgroundColor);

			if (xbound >= (xc + xi) && xbound <= (xc + xo))
			{
				xLine(_display, xc + xi, xbound, yc + y, backgroundColor);
				xLine(_display, xbound, xc + xo, yc + y, foregroundColor);
			}
			
			if (ybound >= (yc + xo) && ybound >= (yc + xi))
				yLine(_display,xc + y, yc + xi, yc + xo, foregroundColor);

			if (ybound < yc + xi)
				yLine(_display, xc + y, yc + xi, yc + xo, backgroundColor);

			if (ybound <= (yc + xo) && ybound >= (yc + xi))
			{
				yLine(_display, xc + y, ybound, yc + xo, backgroundColor);
				yLine(_display, xc + y, yc + xi, ybound, foregroundColor);
			}
		}
		else
		{
			// do foreground directly
			xLine(_display,xc + xi, xc + xo, yc + y, angle > PI / 2 ? foregroundColor : backgroundColor);
			yLine(_display,xc + y, yc + xi, yc + xo, angle > PI / 2 ? foregroundColor : backgroundColor);
		}


		//
		// TOP LEFT CORNER
		//
		if (angle > 3 * PI / 2 && angle <= 2 * PI)
		{
			// do background
			//xLine(_display,xc - xo, xc - xi, yc - y,  backgroundColor);
			//yLine(_display,xc - y,  yc - xo, yc - xi, ILI9341_GREEN);

			// do foreground
			int xbound = xc + y*tan(angle);
			int ybound = yc + y / tan(angle);

			if (xbound >= (xc - xi) && xbound >= (xc - xo))
				xLine(_display,xc - xo, xc - xi, yc - y, foregroundColor);

			if (xbound < xc - xo)
				xLine(_display, xc - xo, xc - xi, yc - y, backgroundColor);

			if (xbound >= (xc - xo) && xbound <= (xc - xi))
			{
				xLine(_display, xbound, xc - xi, yc - y, backgroundColor);
				xLine(_display, xc - xo, xbound, yc - y, foregroundColor);
			}

			if (ybound <= (yc - xo) && ybound <= (yc - xi))
				yLine(_display,xc - y, yc - xo, yc - xi, foregroundColor);

			if (ybound > yc - xi)
				yLine(_display, xc - y, yc - xo, yc - xi, backgroundColor);

			if (ybound >= (yc - xo) && ybound <= (yc - xi))
			{
				yLine(_display, xc - y, yc - xo, ybound, backgroundColor);
				yLine(_display, xc - y, ybound, yc - xi, foregroundColor);
			}
		}
		else
		{
			// do foreground directly
			xLine(_display,xc - xo, xc - xi, yc - y, angle > 3 * PI / 2 ? foregroundColor : backgroundColor);
			yLine(_display,xc - y, yc - xo, yc - xi, angle > 3 * PI / 2 ? foregroundColor : backgroundColor);
		}
		
		//
		// TOP RIGHT CORNER
		//
		if (angle > 0 && angle <= PI / 2)
		{
			// do background
			//xLine(_display,xc + xi, xc + xo, yc - y,  backgroundColor);
			//yLine(_display,xc + y,  yc - xo, yc - xi, backgroundColor);

			// do foreground
			int xbound = xc + y*tan(angle);
			int ybound = yc - y / tan(angle);
			
			if (xbound >= (xc + xi) && xbound >= (xc + xo))
				xLine(_display,xc + xi, xc + xo, yc - y, foregroundColor);

			if (xbound < xc + xi)
				xLine(_display, xc + xi, xc + xo, yc - y, backgroundColor);

			if (xbound >= (xc + xi) && xbound <= (xc + xo))
			{
				xLine(_display, xbound, xc + xo, yc - y, backgroundColor);
				xLine(_display, xc + xi, xbound, yc - y, foregroundColor);
			}

			if (ybound >= (yc - xo) && ybound >= (yc - xi))
				yLine(_display,xc + y, yc - xo, yc - xi, foregroundColor);

			if (ybound < yc - xo)
				yLine(_display, xc + y, yc - xo, yc - xi, backgroundColor);

			if (ybound >= (yc - xo) && ybound <= (yc - xi))
			{
				yLine(_display, xc + y, ybound, yc - xi, backgroundColor);
				yLine(_display, xc + y, yc - xo, ybound, foregroundColor);
			}
		}
		else
		{
			// do foreground directly
			xLine(_display,xc + xi, xc + xo, yc - y, angle > PI / 2 ? foregroundColor : backgroundColor);
			yLine(_display,xc + y, yc - xo, yc - xi, angle > PI / 2 ? foregroundColor : backgroundColor);
		}


		y++;

		if (erro < 0) {
			erro += 2 * y + 1;
		}
		else {
			xo--;
			erro += 2 * (y - xo + 1);
		}

		if (y > inner) {
			xi = y;
		}
		else {
			if (erri < 0) {
				erri += 2 * y + 1;
			}
			else {
				xi--;
				erri += 2 * (y - xi + 1);
			}
		}
	}
}