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