扇形绘制(超低效率)

来源:互联网 发布:python pip安装 编辑:程序博客网 时间:2024/05/16 06:21
#include <graphics.h>      // 就是需要引用这个图形库
#include <iostream>
#include <math.h>
using namespace std;

inline void point(double x, double y)
{
    //采用DDA算法 画点
    putpixel(static_cast<int>(x), static_cast<int>(y + 0.5),RED);
}
//自定义DDA算法画线
void line_1(int x1, int y1, int x2, int y2)
{
    //检查斜率为0的情况
    if (x2 - x1 == 0){
        for (int i = min(y1, y2); i <= max(y1, y2); i++)
        {
            putpixel(x1, i, RED);
        }
        return;
    }
    if (y2 - y1 == 0){
        for (int i = min(x1, x2); i < max(x1, x2); i++)
        {
            putpixel(i, y1, RED);
        }
        return;
    }
    //先进行强制转换   
    double k = static_cast<double>(y2 - y1) / (x2 - x1);
    double k2 = static_cast<double>(x2 - x1) / (y2 - y1);
    if (abs(k) < 1)
    {
        if (x1 > x2)
        {
            std::swap(y1, y2);
            std::swap(x1, x2);
        }
        double y3 = y1;
        for (int i = x1; i <=x2; i++){
            //DDA算法
            putpixel(i, static_cast<int>(y3 + 0.5), GREEN);
            y3 += k;
        }
        return;
    }
    
    
    if (y1 > y2)
    {
        std::swap(y1, y2);
        std::swap(x1, x2);
    }
    double x3 = x1;
    for (int i =y1;i<y2; i++)
    {
        //DDA算法
        putpixel(static_cast<int>(x3 + 0.5), i, GREEN);
        x3 += k2;
    }
}
void shan_xing(int r, double angle)
{
    double angle0 = 0;

    //设置扇形的起边角为0
    double angle1 = angle + angle0;
    //扇形的圆弧两端坐标
    double x0 = r*cos(angle0), y0 = r*sin(angle0);
    double x1 = r*cos(angle1), y1 = r*sin(angle1);
    line_1(0, 0, x0, y0);
    line_1(0, 0, x1, y1);
    int dx = x0 - x1;
    const int R = r*r;
    //如果所画角度超过3.1415926  先进行下一步
    if (y1 < 0)
    {
        int temp_x = x1;

        for (int i = -r; i <= temp_x; i++)
            if (i*i < R / 2)  //以x为增量
                point(i, -sqrt(R - i*i));
            else        //以y为增量
                for (int j = -sqrt(R - i*i); i*i > R / 2 && i <= temp_x; j += i / abs(i))
                {
                    i = i / abs(i)*sqrt(R - j*j);
                    point(i, j);

                }

        x1 = -r, y1 = 0;
    }
    for (int i = x0; i >= x1; i--)
        if (i*i < R / 2)//以x为增量
            point(i, sqrt(R - i*i));
        else     //以y为增量
            for (int j = sqrt(R - i*i); i*i > R / 2&&i>x1; j += i / abs(i))
            {
                i = i / abs(i)*sqrt(R - j*j);
                point(i, j);
            }
}
int main()
{
    initgraph(600, 600);   // 设置画布大小
    setorigin(300,300); //设置坐标原点为(300,300)
    //画扇形
    shan_xing(100, 5);
    system("pause");
    closegraph();          // 关闭图形界面    
}
0 0
原创粉丝点击