头歌实践教学平台:画圆

第1关:画圆

1 任务描述

根据以下要求修改右侧的代码,绘制预期的输出图像。系统将测试您编写的代码。

1.1 任务要求
  • 熟悉编程环境;
  • 了解光栅图形显示的特点;
  • 以OpenGL为开发平台设计程序,理解并掌握圆的对称性和“中点法”,以便能够画出一个圆。
1.2 预期输出

参考图片

1.3 具体要求
  • 背景颜色为黑色(0.0,0.0,0.0,0.0),并以“glclearColor”完成;
  • 编写一个算法来生成圆周上八个对称点的坐标;
  • 使用“中点法”生成一个圆,点的大小设置为2,颜色设置为(0.0f,1.0f,1.0f);
  • 圆心两个端点的坐标为(200,200),半径为150。

2 相关知识

要完成此任务,您需要了解圆的对称性和“中点法”,以便能够绘制圆。

2.1 生成圆周上八个对称点的坐标

根据圆的对称性。如果我们生成一个点(x,y)的坐标,我们将得到八个点的坐标。

参考图片


开始你的编程之旅。

3 实验代码:

#include <GL/freeglut.h>
#include<stdio.h>

// The header file used to evaluate the code - begin
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
// The header file used to evaluate the code - end


//Eight points of symmetry are formed on the circumference of the circle
void CirclePoints(int x0, int y0, int x, int y)
{
    // 添加代码区域
    /********** Begin ********/
    glBegin(GL_POINTS);//绘制点

    glVertex2i(x0+x,y0+y);//八个对称点坐标
    glVertex2i(x0+x,y0-y);
    glVertex2i(x0-x,y0+y);
    glVertex2i(x0-x,y0-y);
    glVertex2i(x0+y,y0+x);
    glVertex2i(x0+y,y0-x);
    glVertex2i(x0-y,y0+x);
    glVertex2i(x0-y,y0-x);

    glEnd();//结束

    /********** End **********/
}

void MidPoint_Circle(int x0, int y0, int r)
{
    // 添加代码区域
    /********** Begin ********/
    int x=0,y=r,d=1-r;
    glBegin(GL_POINTS);//绘制点
    while(x<=y)
    {
        glVertex2i(x0+x,y0+y);//八个对称点坐标
        glVertex2i(x0+x,y0-y);
        glVertex2i(x0-x,y0+y);
        glVertex2i(x0-x,y0-y);
        glVertex2i(x0+y,y0+x);
        glVertex2i(x0+y,y0-x);
        glVertex2i(x0-y,y0+x);
        glVertex2i(x0-y,y0-x);
        if(d<0)
        {
            d=d+2*x+3;
            x=x+1;
        }
        else
        {
            d=d+2*(x-y)+5;
            x++;
            y--;
        }
    }
    glEnd();//结束

    /********** End **********/
}



void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    // Please add your code here
    /********** Begin ********/
    //修改参数区域
    glPointSize(2.0);//点的大小
    glColor3f(0.0, 1.0, 1.0);//颜色设置,青色
    MidPoint_Circle(200 ,200 ,150 );//圆心两个端点的坐标,半径     
    /********** End **********/
    glFlush();
}
void Init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_SMOOTH);
}
void myReshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}

int main(int argc, char* argv[])
{

    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("Hello circle!");
    Init();
    glutDisplayFunc(myDisplay);
    glutReshapeFunc(myReshape);
    glutMainLoopEvent();
 

    //The following is the evaluation code, which has nothing to do with the content of this experiment. Please do not modify it//
    GLubyte* pPixelData = (GLubyte*)malloc(400 * 400 * 3);
    GLint viewport[4] = { 0 };
    glReadBuffer(GL_FRONT);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
    glGetIntegerv(GL_VIEWPORT, viewport);
    glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData);

    cv::Mat img;
    std::vector<cv::Mat> imgPlanes;
    img.create(400, 400, CV_8UC3);
    cv::split(img, imgPlanes);

    for (int i = 0; i < 400; i++) {
        unsigned char* plane0Ptr = imgPlanes[0].ptr<unsigned char>(i);
        unsigned char* plane1Ptr = imgPlanes[1].ptr<unsigned char>(i);
        unsigned char* plane2Ptr = imgPlanes[2].ptr<unsigned char>(i);
        for (int j = 0; j < 400; j++) {
            int k = 3 * (i * 400 + j);
            plane2Ptr[j] = pPixelData[k];
            plane1Ptr[j] = pPixelData[k + 1];
            plane0Ptr[j] = pPixelData[k + 2];
        }
    }
    cv::merge(imgPlanes, img);
    cv::flip(img, img, 0);
    cv::namedWindow("openglGrab");
    cv::imshow("openglGrab", img);
    //cv::waitKey();//
    cv::imwrite("../img_step3/test.jpg", img);
    return 0;
}

摘要:VB源码,图形处理,VB恶搞程序,屏幕抖动   再分享一个Vb恶搞程序,屏幕抖动下雪下雪API声明(摘录):   GetDC()功能是获取指定窗体的设备场景的句柄(hDC),用参数0则可以获取整个屏幕的场景句柄   GetPixel用于取得场景(这里是整个屏幕)中某点的颜色值   释放由GetDC()获取的设备场景句柄,否则可能造成系统锁死   定义“区域”数据结构,但实际上并没有用到,因为仅需在函数InvalidateRect中传递一个空的RECT参数   Dim rect1 As RECT   Private Const ScrnWidth = 1024 ‘屏幕宽度(单位:像素)   Private Const ScrnHight = 768 ‘屏幕高度(单位:像素)   Private Const SnowCol = &HFEFFFE ‘雪花颜色   Private Const SnowColDown = &HFFFFFF ‘积雪颜色   Private Const SnowColDuck = &HFFDDDD ‘深色积雪颜色   Private Const SnowNum = 500 ‘同一时间飘动的雪花数量   Dim hDC1 As Long ‘存储桌面窗口设备句柄   Dim pData(SnowNum) As POINTAPI ‘存储每个雪花的位置信息   Dim pColor(SnowNum) As Long ‘存储画出雪花前屏幕原来的颜色   Dim Vx As Integer ‘雪花总体水平飘行速度   Dim Vy As Integer ‘雪花总体垂直下落速度   Dim PVx As Integer ‘单个雪花实际水平飘行速度   Dim PVy As Integer ‘单个雪花实际垂直飘行速度   确定当前位置没有与另一个雪花重叠,否则返回0,用于防止由于不同雪花重叠造成雪花乱堆,分别获取ColorCmp与对比点的蓝、绿、红部分的差值,画出一帧,即重画所有雪花位置一次,设置新的位置,i Mod 3用于将雪花分为三类采用不同速度,以便形成层次感。   注意,测试时候如果要停止程序,请在任务栏右键直接关闭程序字符串即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值