📄 gui_basic.lst
字号:
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 9
489 * 说明:操作失败原因是指定地址超出有效范围。
490 ****************************************************************************/
491 void GUI_CircleFill(uint32 x0, uint32 y0, uint32 r, TCOLOR color)
492 { int32 draw_x0, draw_y0; // 刽图点坐标变量
493 1 int32 draw_x1, draw_y1;
494 1 int32 draw_x2, draw_y2;
495 1 int32 draw_x3, draw_y3;
496 1 int32 draw_x4, draw_y4;
497 1 int32 draw_x5, draw_y5;
498 1 int32 draw_x6, draw_y6;
499 1 int32 draw_x7, draw_y7;
500 1 int32 fill_x0, fill_y0; // 填充所需的变量,使用垂直线填充
501 1 int32 fill_x1;
502 1 int32 xx, yy; // 画圆控制变量
503 1
504 1 int32 di; // 决策变量
505 1
506 1 /* 参数过滤 */
507 1 if(0==r) return;
508 1
509 1 /* 计算出4个特殊点(0、90、180、270度),进行显示 */
510 1 draw_x0 = draw_x1 = x0;
511 1 draw_y0 = draw_y1 = y0 + r;
512 1 if(draw_y0<GUI_LCM_YMAX)
513 1 { GUI_Point(draw_x0, draw_y0, color); // 90度
514 2 }
515 1
516 1 draw_x2 = draw_x3 = x0;
517 1 draw_y2 = draw_y3 = y0 - r;
518 1 if(draw_y2>=0)
519 1 { GUI_Point(draw_x2, draw_y2, color); // 270度
520 2 }
521 1
522 1 draw_x4 = draw_x6 = x0 + r;
523 1 draw_y4 = draw_y6 = y0;
524 1 if(draw_x4<GUI_LCM_XMAX)
525 1 { GUI_Point(draw_x4, draw_y4, color); // 0度
526 2 fill_x1 = draw_x4;
527 2 }
528 1 else
529 1 { fill_x1 = GUI_LCM_XMAX;
530 2 }
531 1 fill_y0 = y0; // 设置填充线条起始点fill_x0
532 1 fill_x0 = x0 - r; // 设置填充线条结束点fill_y1
533 1 if(fill_x0<0) fill_x0 = 0;
534 1 GUI_HLine(fill_x0, fill_y0, fill_x1, color);
535 1
536 1 draw_x5 = draw_x7 = x0 - r;
537 1 draw_y5 = draw_y7 = y0;
538 1 if(draw_x5>=0)
539 1 { GUI_Point(draw_x5, draw_y5, color); // 180度
540 2 }
541 1 if(1==r) return;
542 1
543 1
544 1 /* 使用Bresenham法进行画圆 */
545 1 di = 3 - 2*r; // 初始化决策变量
546 1
547 1 xx = 0;
548 1 yy = r;
549 1 while(xx<yy)
550 1 { if(di<0)
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 10
551 2 { di += 4*xx + 6;
552 3 }
553 2 else
554 2 { di += 4*(xx - yy) + 10;
555 3
556 3 yy--;
557 3 draw_y0--;
558 3 draw_y1--;
559 3 draw_y2++;
560 3 draw_y3++;
561 3 draw_x4--;
562 3 draw_x5++;
563 3 draw_x6--;
564 3 draw_x7++;
565 3 }
566 2
567 2 xx++;
568 2 draw_x0++;
569 2 draw_x1--;
570 2 draw_x2++;
571 2 draw_x3--;
572 2 draw_y4++;
573 2 draw_y5++;
574 2 draw_y6--;
575 2 draw_y7--;
576 2
577 2
578 2 /* 要判断当前点是否在有效范围内 */
579 2 if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )
580 2 { GUI_Point(draw_x0, draw_y0, color);
581 3 }
582 2 if( (draw_x1>=0)&&(draw_y1>=0) )
583 2 { GUI_Point(draw_x1, draw_y1, color);
584 3 }
585 2
586 2 /* 第二点水直线填充(下半圆的点) */
587 2 if(draw_x1>=0)
588 2 { /* 设置填充线条起始点fill_x0 */
589 3 fill_x0 = draw_x1;
590 3 /* 设置填充线条起始点fill_y0 */
591 3 fill_y0 = draw_y1;
592 3 if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
593 3 if(fill_y0<0) fill_y0 = 0;
594 3 /* 设置填充线条结束点fill_x1 */
595 3 fill_x1 = x0*2 - draw_x1;
596 3 if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
597 3 GUI_HLine(fill_x0, fill_y0, fill_x1, color);
598 3 }
599 2
600 2
601 2 if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )
602 2 { GUI_Point(draw_x2, draw_y2, color);
603 3 }
604 2
605 2 if( (draw_x3>=0)&&(draw_y3<=GUI_LCM_YMAX) )
606 2 { GUI_Point(draw_x3, draw_y3, color);
607 3 }
608 2
609 2 /* 第四点垂直线填充(上半圆的点) */
610 2 if(draw_x3>=0)
611 2 { /* 设置填充线条起始点fill_x0 */
612 3 fill_x0 = draw_x3;
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 11
613 3 /* 设置填充线条起始点fill_y0 */
614 3 fill_y0 = draw_y3;
615 3 if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
616 3 if(fill_y0<0) fill_y0 = 0;
617 3 /* 设置填充线条结束点fill_x1 */
618 3 fill_x1 = x0*2 - draw_x3;
619 3 if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
620 3 GUI_HLine(fill_x0, fill_y0, fill_x1, color);
621 3 }
622 2
623 2
624 2 if( (draw_x4<=GUI_LCM_XMAX)&&(draw_y4>=0) )
625 2 { GUI_Point(draw_x4, draw_y4, color);
626 3 }
627 2 if( (draw_x5>=0)&&(draw_y5>=0) )
628 2 { GUI_Point(draw_x5, draw_y5, color);
629 3 }
630 2
631 2 /* 第六点垂直线填充(上半圆的点) */
632 2 if(draw_x5>=0)
633 2 { /* 设置填充线条起始点fill_x0 */
634 3 fill_x0 = draw_x5;
635 3 /* 设置填充线条起始点fill_y0 */
636 3 fill_y0 = draw_y5;
637 3 if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
638 3 if(fill_y0<0) fill_y0 = 0;
639 3 /* 设置填充线条结束点fill_x1 */
640 3 fill_x1 = x0*2 - draw_x5;
641 3 if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
642 3 GUI_HLine(fill_x0, fill_y0, fill_x1, color);
643 3 }
644 2
645 2
646 2 if( (draw_x6<=GUI_LCM_XMAX)&&(draw_y6<=GUI_LCM_YMAX) )
647 2 { GUI_Point(draw_x6, draw_y6, color);
648 3 }
649 2
650 2 if( (draw_x7>=0)&&(draw_y7<=GUI_LCM_YMAX) )
651 2 { GUI_Point(draw_x7, draw_y7, color);
652 3 }
653 2
654 2 /* 第八点垂直线填充(上半圆的点) */
655 2 if(draw_x7>=0)
656 2 { /* 设置填充线条起始点fill_x0 */
657 3 fill_x0 = draw_x7;
658 3 /* 设置填充线条起始点fill_y0 */
659 3 fill_y0 = draw_y7;
660 3 if(fill_y0>GUI_LCM_YMAX) fill_y0 = GUI_LCM_YMAX;
661 3 if(fill_y0<0) fill_y0 = 0;
662 3 /* 设置填充线条结束点fill_x1 */
663 3 fill_x1 = x0*2 - draw_x7;
664 3 if(fill_x1>GUI_LCM_XMAX) fill_x1 = GUI_LCM_XMAX;
665 3 GUI_HLine(fill_x0, fill_y0, fill_x1, color);
666 3 }
667 2
668 2 }
669 1 }
670 #endif
671
672
673
674
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 12
675 #if GUI_EllipseX_EN==1
676 /****************************************************************************
677 * 名称:GUI_Ellipse()
678 * 功能:画正椭圆。给定椭圆的四个点的参数,最左、最右点的x轴坐标值为x0、x1,最上、最下点
679 * 的y轴坐标为y0、y1。
680 * 入口参数: x0 最左点的x坐标值
681 * x1 最右点的x坐标值
682 * y0 最上点的y坐标值
683 * y1 最下点的y坐标值
684 * color 显示颜色
685 * 出口参数:无
686 * 说明:操作失败原因是指定地址超出有效范围。
687 ****************************************************************************/
688 void GUI_Ellipse(uint32 x0, uint32 x1, uint32 y0, uint32 y1, TCOLOR color)
689 { int32 draw_x0, draw_y0; // 刽图点坐标变量
690 1 int32 draw_x1, draw_y1;
691 1 int32 draw_x2, draw_y2;
692 1 int32 draw_x3, draw_y3;
693 1 int32 xx, yy; // 画图控制变量
694 1
695 1 int32 center_x, center_y; // 椭圆中心点坐标变量
696 1 int32 radius_x, radius_y; // 椭圆的半径,x轴半径和y轴半径
697 1 int32 radius_xx, radius_yy; // 半径乘平方值
698 1 int32 radius_xx2, radius_yy2; // 半径乘平方值的两倍
699 1 int32 di; // 定义决策变量
700 1
701 1 /* 参数过滤 */
702 1 if( (x0==x1) || (y0==y1) ) return;
703 1
704 1 /* 计算出椭圆中心点坐标 */
705 1 center_x = (x0 + x1) >> 1;
706 1 center_y = (y0 + y1) >> 1;
707 1
708 1 /* 计算出椭圆的半径,x轴半径和y轴半径 */
709 1 if(x0 > x1)
710 1 { radius_x = (x0 - x1) >> 1;
711 2 }
712 1 else
713 1 { radius_x = (x1 - x0) >> 1;
714 2 }
715 1 if(y0 > y1)
716 1 { radius_y = (y0 - y1) >> 1;
717 2 }
718 1 else
719 1 { radius_y = (y1 - y0) >> 1;
720 2 }
721 1
722 1 /* 计算半径平方值 */
723 1 radius_xx = radius_x * radius_x;
724 1 radius_yy = radius_y * radius_y;
725 1
726 1 /* 计算半径平方值乘2值 */
727 1 radius_xx2 = radius_xx<<1;
728 1 radius_yy2 = radius_yy<<1;
729 1
730 1 /* 初始化画图变量 */
731 1 xx = 0;
732 1 yy = radius_y;
733 1
734 1 di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化决策变量
735 1
736 1 /* 计算出椭圆y轴上的两个端点坐标,作为作图起点 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -