Zobrazování grafů a složitějších věcí na TFT

Zde přikládám kód:

void drawPie(int x, int y, int r, int startAngle, int endAngle, int color)
{	
	int tempX, tempY, tempX1, tempX2, tempY2;	
	float i=0;	
	bool kvadrant[4];	
	
	if (startAngle < 90 && endAngle > 0)
		kvadrant[3] = TRUE;
	else
		kvadrant[3] = FALSE;
	if (startAngle < 180 && endAngle > 90)
		kvadrant[2] = TRUE;
	else
		kvadrant[2] = FALSE;
	if (startAngle < 270 && endAngle > 180)
		kvadrant[1] = TRUE;
	else
		kvadrant[1] = FALSE;
	if (startAngle < 360 && endAngle > 270)
		kvadrant[0] = TRUE;
	else
		kvadrant[0] = FALSE;

	for (i = 0; i <= 90; i=i+(float)0.5)
	{		
		tempX = (int)(r * returnSinCos("cos", i));
		tempY = (int)(r * returnSinCos("sin", i));
		if (kvadrant[3])
		{
			tempX2 = tempX;
			tempX1 = 0;
			if (startAngle != 0)
				tempX2 = (int)(tempY * TAN(90 - startAngle) * 2]);
			if (endAngle < 90)
				tempX1 = (int)(tempY * TAN(90 - endAngle) * 2]); ;
			if (endAngle >= 90 && startAngle <= 0)
				TFT_DrawLine(x, y + tempY, x + tempX, y + tempY, color);
			else if ((x + tempX2) < (x + tempX))
				TFT_DrawLine(x + tempX1, y + tempY, x + tempX2, y + tempY, color);
			else if ((x + tempX1) < (x + tempX))
				TFT_DrawLine(x + tempX1, y + tempY, x + tempX, y + tempY, color);
		}
		if (kvadrant[2])
		{
			tempX2 = tempX;
			tempX1 = 0;
			if (endAngle < 180)
				tempX2 = (int)(tempY * TAN(endAngle - 90) * 2]);
			if (startAngle > 90)
				tempX1 = (int)(tempY * TAN(startAngle - 90) * 2]);
			if (endAngle >= 180 && startAngle <= 90)
				TFT_DrawLine(x, y + tempY, x - tempX, y + tempY, color);
			else if ((tempX2 + x) < (x + tempX))
				TFT_DrawLine(x - tempX1, y + tempY, x - tempX2, y + tempY, color);
			else if ((tempX1) <= (tempX))
				TFT_DrawLine(x - tempX, y + tempY, x - tempX1, y + tempY, color);

		}
		if (kvadrant[1])
		{
			tempX2 = tempX;
			tempX1 = 0;
			if (startAngle > 180)
				tempX2 = (int)(tempY * TAN(270 - startAngle) * 2]);
			if (endAngle < 270)
				tempX1 = (int)(tempY * TAN(270 - endAngle) * 2]);
			if (startAngle <= 180 && endAngle >= 270)
				TFT_DrawLine(x, y - tempY, x - tempX, y - tempY, color);
			else if (tempX2 < tempX)
				TFT_DrawLine(x - tempX2, y - tempY, x - tempX1, y - tempY, color);
			else if ((tempX1) < (tempX))
				TFT_DrawLine(x - tempX, y - tempY, x - tempX1, y - tempY, color);

		}

		if (kvadrant[0])
		{                    
			tempX1 = 0;
			tempX2 = tempX;
			if (startAngle > 270)
				tempX1 = (int)(tempY * TAN(startAngle - 270) * 2]);
			if (endAngle < 360)
				tempX2 = (int)(tempY * TAN(endAngle - 270) * 2]);
			if (startAngle <= 270 && endAngle >= 360)
				TFT_DrawLine(x, y - tempY, x + tempX, y - tempY, color);
			else if ((x + tempX2) < (x + tempX))
				TFT_DrawLine(x + tempX1, y - tempY, x + tempX2, y - tempY, color);
			else if ((x + tempX1) < (x + tempX))
				TFT_DrawLine(x + tempX, y - tempY, x + tempX1, y - tempY, color);
		}								
	}
}

proměnná TAN jsou hodnoty tangensu od 0 do 90 po 0.5°. Je to možná zbytečné, ale říkal sem si, každá ušetřená milisekunda dobrá. Je to možný nahradit za tan(2M_PIi/360), u SINu a COSinu to samé. funkce returnSinCos():

double returnSinCos(char *function, float angle)
{
	if (angle > 360) angle = angle - 360 * (int)(angle / 360);
	if(function == "sin"){
		float realAngle = angle;
		if (angle <= 90) ;
		else if (angle <= 180) realAngle = 180 - angle;
		else if (angle <= 270) realAngle = angle - 180;
		else if (angle <= 360) realAngle = 360 - angle;                                
		return angle <= 180 ? 1 * SIN(int)(2*realAngle)]: -1 * SIN(int)(2*realAngle)];
	}
	else if (function == "cos")
	{
		float realAngle = angle;
		if (angle <= 90) ;
		else if (angle <= 180) realAngle = 180 - angle;
		else if (angle <= 270) realAngle = angle - 180;
		else if (angle <= 360) realAngle = 360 - angle;                                
		return (angle >=90 && angle<=270) ? -1 * COS(int)(2*realAngle)]: 1 * COS(int)(2*realAngle)];
	}
	return 0;
}

Vím, že by se to dalo ještě zredukovat na podmínku pro vrchní půlkruh a spodní, ale už se mi nad tím nechtělo přemýšlet. Snad se to někomu bude hodit. :slight_smile: