📄 guibasic.lst
字号:
750 * 出口参数:无
751 * 说明:操作失败原因是指定地址超出有效范围。
752 ****************************************************************************/
753 void GUI_Ellipse(uint32 x0, uint32 x1, uint32 y0, uint32 y1, uint8 color)
754 { int32 draw_x0, draw_y0; // 刽图点坐标变量
755 int32 draw_x1, draw_y1;
756 int32 draw_x2, draw_y2;
757 int32 draw_x3, draw_y3;
758 int32 xx, yy; // 画图控制变量
759
760 int32 center_x, center_y; // 椭圆中心点坐标变量
761 int32 radius_x, radius_y; // 椭圆的半径,x轴半径和y轴半径
762 int32 radius_xx, radius_yy; // 半径乘平方值
763 int32 radius_xx2, radius_yy2; // 半径乘平方值的两倍
764 int32 di; // 定义决策变量
765
766 /* 参数过滤 */
767 if( (x0==x1) || (y0==y1) ) return;
768
769 /* 计算出椭圆中心点坐标 */
770 center_x = (x0 + x1) >> 1;
771 center_y = (y0 + y1) >> 1;
772
773 /* 计算出椭圆的半径,x轴半径和y轴半径 */
774 if(x0 > x1)
775 { radius_x = (x0 - x1) >> 1;
776 }
777 else
778 { radius_x = (x1 - x0) >> 1;
779 }
780 if(y0 > y1)
781 { radius_y = (y0 - y1) >> 1;
782 }
783 else
784 { radius_y = (y1 - y0) >> 1;
785 }
786
787 /* 计算半径平方值 */
788 radius_xx = radius_x * radius_x;
789 radius_yy = radius_y * radius_y;
790
791 /* 计算半径平方值乘2值 */
792 radius_xx2 = radius_xx<<1;
793 radius_yy2 = radius_yy<<1;
794
795 /* 初始化画图变量 */
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 14
796 xx = 0;
797 yy = radius_y;
798
799 di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化决策变量
800
801 /* 计算出椭圆y轴上的两个端点坐标,作为作图起点 */
802 draw_x0 = draw_x1 = draw_x2 = draw_x3 = center_x;
803 draw_y0 = draw_y1 = center_y + radius_y;
804 draw_y2 = draw_y3 = center_y - radius_y;
805
806
807 GUI_Point(draw_x0, draw_y0, color); // 画y轴上的两个端点
808 GUI_Point(draw_x2, draw_y2, color);
809
810 while( (radius_yy*xx) < (radius_xx*yy) )
811 { if(di<0)
812 { di+= radius_yy2*(2*xx+3);
813 }
814 else
815 { di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy;
816
817 yy--;
818 draw_y0--;
819 draw_y1--;
820 draw_y2++;
821 draw_y3++;
822 }
823
824 xx ++; // x轴加1
825
826 draw_x0++;
827 draw_x1--;
828 draw_x2++;
829 draw_x3--;
830
831 GUI_Point(draw_x0, draw_y0, color);
832 GUI_Point(draw_x1, draw_y1, color);
833 GUI_Point(draw_x2, draw_y2, color);
834 GUI_Point(draw_x3, draw_y3, color);
835 }
836
837 di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy;
838 while(yy>=0)
839 { if(di<0)
840 { di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy;
841
842 xx ++; // x轴加1
843 draw_x0++;
844 draw_x1--;
845 draw_x2++;
846 draw_x3--;
847 }
848 else
849 { di += radius_xx2*3 - 2*radius_xx2*yy;
850 }
851
852 yy--;
853 draw_y0--;
854 draw_y1--;
855 draw_y2++;
856 draw_y3++;
857
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 15
858 GUI_Point(draw_x0, draw_y0, color);
859 GUI_Point(draw_x1, draw_y1, color);
860 GUI_Point(draw_x2, draw_y2, color);
861 GUI_Point(draw_x3, draw_y3, color);
862 }
863 }
864
865
866 /****************************************************************************
867 * 名称:GUI_EllipseFill()
868 * 功能:画正椭圆,并填充。给定椭圆的四个点的参数,最左、最右点的x轴坐标值为x0、x1,最上、最下点
869 * 的y轴坐标为y0、y1。
870 * 入口参数: x0 最左点的x坐标值
871 * x1 最右点的x坐标值
872 * y0 最上点的y坐标值
873 * y1 最下点的y坐标值
874 * color 填充颜色
875 * 出口参数:无
876 * 说明:操作失败原因是指定地址超出有效范围。
877 ****************************************************************************/
878 void GUI_EllipseFill(uint32 x0, uint32 x1, uint32 y0, uint32 y1, uint8 color)
879 { int32 draw_x0, draw_y0; // 刽图点坐标变量
880 int32 draw_x1, draw_y1;
881 int32 draw_x2, draw_y2;
882 int32 draw_x3, draw_y3;
883 int32 xx, yy; // 画图控制变量
884
885 int32 center_x, center_y; // 椭圆中心点坐标变量
886 int32 radius_x, radius_y; // 椭圆的半径,x轴半径和y轴半径
887 int32 radius_xx, radius_yy; // 半径乘平方值
888 int32 radius_xx2, radius_yy2; // 半径乘平方值的两倍
889 int32 di; // 定义决策变量
890
891 /* 参数过滤 */
892 if( (x0==x1) || (y0==y1) ) return;
893
894 /* 计算出椭圆中心点坐标 */
895 center_x = (x0 + x1) >> 1;
896 center_y = (y0 + y1) >> 1;
897
898 /* 计算出椭圆的半径,x轴半径和y轴半径 */
899 if(x0 > x1)
900 { radius_x = (x0 - x1) >> 1;
901 }
902 else
903 { radius_x = (x1 - x0) >> 1;
904 }
905 if(y0 > y1)
906 { radius_y = (y0 - y1) >> 1;
907 }
908 else
909 { radius_y = (y1 - y0) >> 1;
910 }
911
912 /* 计算半径乘平方值 */
913 radius_xx = radius_x * radius_x;
914 radius_yy = radius_y * radius_y;
915
916 /* 计算半径乘4值 */
917 radius_xx2 = radius_xx<<1;
918 radius_yy2 = radius_yy<<1;
919
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 16
920 /* 初始化画图变量 */
921 xx = 0;
922 yy = radius_y;
923
924 di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化决策变量
925
926 /* 计算出椭圆y轴上的两个端点坐标,作为作图起点 */
927 draw_x0 = draw_x1 = draw_x2 = draw_x3 = center_x;
928 draw_y0 = draw_y1 = center_y + radius_y;
929 draw_y2 = draw_y3 = center_y - radius_y;
930
931
932 GUI_Point(draw_x0, draw_y0, color); // 画y轴上的两个端点
933 GUI_Point(draw_x2, draw_y2, color);
934
935 while( (radius_yy*xx) < (radius_xx*yy) )
936 { if(di<0)
937 { di+= radius_yy2*(2*xx+3);
938 }
939 else
940 { di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy;
941
942 yy--;
943 draw_y0--;
944 draw_y1--;
945 draw_y2++;
946 draw_y3++;
947 }
948
949 xx ++; // x轴加1
950
951 draw_x0++;
952 draw_x1--;
953 draw_x2++;
954 draw_x3--;
955
956 GUI_Point(draw_x0, draw_y0, color);
957 GUI_Point(draw_x1, draw_y1, color);
958 GUI_Point(draw_x2, draw_y2, color);
959 GUI_Point(draw_x3, draw_y3, color);
960
961 /* 若y轴已变化,进行填充 */
962 if(di>=0)
963 { GUI_HLine(draw_x0, draw_y0, draw_x1, color);
964 GUI_HLine(draw_x2, draw_y2, draw_x3, color);
965 }
966 }
967
968 di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy;
969 while(yy>=0)
970 { if(di<0)
971 { di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy;
972
973 xx ++; // x轴加1
974 draw_x0++;
975 draw_x1--;
976 draw_x2++;
977 draw_x3--;
978 }
979 else
980 { di += radius_xx2*3 - 2*radius_xx2*yy;
981 }
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 17
982
983 yy--;
984 draw_y0--;
985 draw_y1--;
986 draw_y2++;
987 draw_y3++;
988
989 GUI_Point(draw_x0, draw_y0, color);
990 GUI_Point(draw_x1, draw_y1, color);
991 GUI_Point(draw_x2, draw_y2, color);
992 GUI_Point(draw_x3, draw_y3, color);
993
994 /* y轴已变化,进行填充 */
995 GUI_HLine(draw_x0, draw_y0, draw_x1, color);
996 GUI_HLine(draw_x2, draw_y2, draw_x3, color);
997 }
998 }
999
1000
C51 COMPILATION COMPLETE. 0 WARNING(S), 4 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -