?? gui_basic.c
字號:
draw_on = 0; // 最開始關畫點開關
/* 設置起始點及終點 */
if(endangle>stangle) draw_on = 1; // 若終點大于起點,則從一開始即畫點(359)
stangle = (360-stangle)*pno_angle/45;
endangle = (360-endangle)*pno_angle/45;
if(stangle==0) stangle=1;
if(endangle==0) endangle=1;
/* 開始順時針畫弧,從359度開始(第4像限) */
pno_angle = 0;
draw_x = x+r;
draw_y = y;
op_x = r;
op_y = 0;
while(1)
{ /* 計算下一點 */
op_y++;
draw_y--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_x +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_x--;
draw_x--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_y>=op_x)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
while(1)
{ /* 計算下一點 */
op_x--;
draw_x--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_y +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_y++;
draw_y--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_x<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
/* 開始順時針畫弧,從269度開始(第3像限) */
draw_y = y-r;
draw_x = x;
op_y = r;
op_x = 0;
while(1)
{ /* 計算下一點 */
op_x++;
draw_x--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_y +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_y--;
draw_y++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_x>=op_y)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
while(1)
{ /* 計算下一點 */
op_y--;
draw_y++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_x +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_x++;
draw_x--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_y<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
/* 開始順時針畫弧,從179度開始(第2像限) */
draw_x = x-r;
draw_y = y;
op_x = r;
op_y = 0;
while(1)
{ /* 計算下一點 */
op_y++;
draw_y++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_x +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_x--;
draw_x++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_y>=op_x)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
while(1)
{ /* 計算下一點 */
op_x--;
draw_x++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_y +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_y++;
draw_y++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_x<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
/* 開始順時針畫弧,從89度開始(第1像限) */
draw_y = y+r;
draw_x = x;
op_y = r;
op_x = 0;
while(1)
{ /* 計算下一點 */
op_x++;
draw_x++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_y +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_y--;
draw_y--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_x>=op_y)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
while(1)
{ /* 計算下一點 */
op_y--;
draw_y--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_x +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_x++;
draw_x++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
}
if(op_y<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
}
#endif
#if GUI_Pieslice_EN==1
/****************************************************************************
* 名稱:GUI_Pieslice()
* 功能:指定起點、終點及半徑扇形(不能畫圓)。使用的是順時針方向畫圖。
* 入口參數: x 圓心的x軸坐標值
* y 圓心的y軸坐標值
* stangle 起始角度(0-359度)
* endangle 終止角度(0-359度)
* r 圓的半徑終點
* color 顯示顏色
* 出口參數:無
* 說明:操作失敗原因是指定地址超出有效范圍。
****************************************************************************/
void GUI_Pieslice(uint32 x, uint32 y, uint32 r, uint32 stangle, uint32 endangle, TCOLOR color)
{ int32 draw_x, draw_y; // 畫圖坐標變量
int32 op_x, op_y; // 操作坐標
int32 op_2rr; // 2*r*r值變量
int32 pno_angle; // 度角點的個數
uint8 draw_on; // 畫點開關,為1時畫點,為0時不畫
/* 參數過濾 */
if(r==0) return; // 半徑為0則直接退出
if(stangle==endangle) return; // 起始角度與終止角度相同,退出
if( (stangle>=360) || (endangle>=360) ) return;
op_2rr = 2*r*r; // 計算r平方乖以2
pno_angle = 0;
/* 先計算出在此半徑下的45度的圓弧的點數 */
op_x = r;
op_y = 0;
while(1)
{ pno_angle++; // 畫點計數
/* 計算下一點 */
op_y++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_x +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_x--;
}
if(op_y>=op_x) break;
}
draw_on = 0; // 最開始關畫點開關
/* 設置起始點及終點 */
if(endangle>stangle) draw_on = 1; // 若終點大于起點,則從一開始即畫點(359)
stangle = (360-stangle)*pno_angle/45;
endangle = (360-endangle)*pno_angle/45;
if(stangle==0) stangle=1;
if(endangle==0) endangle=1;
/* 開始順時針畫弧,從359度開始(第4像限) */
pno_angle = 0;
draw_x = x+r;
draw_y = y;
op_x = r;
op_y = 0;
while(1)
{ /* 計算下一點 */
op_y++;
draw_y--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_x +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_x--;
draw_x--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_y>=op_x)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
while(1)
{ /* 計算下一點 */
op_x--;
draw_x--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_y +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_y++;
draw_y--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_x<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
/* 開始順時針畫弧,從269度開始(第3像限) */
draw_y = y-r;
draw_x = x;
op_y = r;
op_x = 0;
while(1)
{ /* 計算下一點 */
op_x++;
draw_x--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_y +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_y--;
draw_y++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_x>=op_y)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
while(1)
{ /* 計算下一點 */
op_y--;
draw_y++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_x +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_x++;
draw_x--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_y<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
/* 開始順時針畫弧,從179度開始(第2像限) */
draw_x = x-r;
draw_y = y;
op_x = r;
op_y = 0;
while(1)
{ /* 計算下一點 */
op_y++;
draw_y++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_x +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_x--;
draw_x++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_y>=op_x)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
while(1)
{ /* 計算下一點 */
op_x--;
draw_x++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_y +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_y++;
draw_y++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_x<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
/* 開始順時針畫弧,從89度開始(第1像限) */
draw_y = y+r;
draw_x = x;
op_y = r;
op_x = 0;
while(1)
{ /* 計算下一點 */
op_x++;
draw_x++;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr - 2*op_y +1)>0 ) // 使用逐點比較法實現畫圓弧
{ op_y--;
draw_y--;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_x>=op_y)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
break;
}
}
while(1)
{ /* 計算下一點 */
op_y--;
draw_y--;
if( (2*op_x*op_x + 2*op_y*op_y - op_2rr + 2*op_x +1)<=0 ) // 使用逐點比較法實現畫圓弧
{ op_x++;
draw_x++;
}
if(draw_on==1) GUI_Point(draw_x, draw_y, color); // 開始畫圖
pno_angle++;
if( (pno_angle==stangle)||(pno_angle==endangle) ) // 若遇到起點或終點,畫點開關取反
{ draw_on = 1-draw_on;
if(draw_on==1) GUI_Point(draw_x, draw_y, color);
GUI_Line(x, y, draw_x, draw_y, color);
}
if(op_y<=0)
{ if(draw_on==1) GUI_Point(draw_x, draw_y, color);
break;
}
}
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -