计算机图形学头歌实训平台答案——CG1-v2.0-直线绘制

 第1关:直线光栅化-DDA画线算法

任务描述

1.本关任务

(1)根据直线DDA算法补全line函数,其中直线斜率0<k<1; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。

2.输入

(1)直线两端点坐标:(13, 20)和(180,140); (2)直线颜色为白色。

3.输出

程序运行结果为一条直线,具体结果如下图所示:

test

整体代码如下:

#include "tgaimage.h"const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255);void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color)
{// Please add the code here/********** Begin ********/int x;float y, k;k = (float)(y1 - y0) / (float)(x1 - x0);y = y0;for (x = x0;x <= x1;x++){image.set(x, int(y + 0.5f),color);y = y + k;}/********** End *********/
}int main(int argc, char** argv)
{TGAImage image(640,480, TGAImage::RGB);line(13, 20, 180, 140, image, white);image.flip_vertically(); // i want to have the origin at the left bottom corner of the imageimage.write_tga_file("../img_step1/test.tga");return 0;
}

 为防止一些刘亦菲和吴彦祖们看不出来,那小Mo就把更加简洁的代码放到下面啦

(有木有很贴心,还不给小Mo点个关注鼓励一下🥰)

(begin和end之间的代码):

代码段一:

   /********** Begin ********/

    int x;

    float y, k;

    k = (float)(y1 - y0) / (float)(x1 - x0);

    y = y0;

    for (x = x0;x <= x1;x++)

    {

        image.set(x, int(y + 0.5f),color);

        y = y + k;

    }

    /********** End *********/

第2关:直线光栅化-中点画线算法

任务描述

1.本关任务

(1)根据直线中点画线算法补全line函数,其中直线斜率0<k<1,并将main函数中的line函数参数补充完整; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。

2.输入

(1)直线两端点坐标:(100, 100)和(520,300); (2)直线颜色为红色。

3.输出

程序运行结果为一条直线,具体结果如下图所示

test

整体代码如下:

#include "tgaimage.h"const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255);void line(int x1, int y1, int xn, int yn, TGAImage &image, TGAColor color)
{// Please add the code here/********** Begin ********/int dx,dy,dt,db,d,x,y;dx = xn - x1;dy = yn - y1;d = dx - 2*dy;dt = 2*dx - 2*dy;db = -2*dy;x = x1;y = y1;image.set(x,y,color);while (x < xn){if (d <= 0){    x++;y++;d += dt;}else{x++;d += db;}image.set(x,y,color);}/********** End *********/
}int main(int argc, char** argv)
{TGAImage image(640,480, TGAImage::RGB);// Please add the code here/********** Begin ********/line( 100, 100 , 520 , 300 , image, red );/********** End *********/image.flip_vertically(); // i want to have the origin at the left bottom corner of the imageimage.write_tga_file("../img_step4/test.tga");return 0;
}

按照小Mo惯例,还是把需要填写的代码段po出来喽~

代码段一:

 /********** Begin ********/

    int dx,dy,dt,db,d,x,y;

        dx = xn - x1;

        dy = yn - y1;

        d = dx - 2*dy;

        dt = 2*dx - 2*dy;

        db = -2*dy;

        x = x1;y = y1;

        image.set(x,y,color);

        while (x < xn)

        {

            if (d <= 0)

            {    x++;

                y++;

                d += dt;

                }

        else

        {

            x++;

            d += db;

        }

        image.set(x,y,color);

        }

    /********** End *********/

代码段二:

    /********** Begin ********/

    line( 100, 100 , 520 , 300 , image, red );

    /********** End *********/

 第3关:直线光栅化-Bresenham画线算法

任务描述:

1.本关任务

(1)根据直线Bresenham算法补全line函数,其中直线斜率0<k<1,并将main函数中的line函数参数补充完整; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。

2.输入

(1)直线两端点坐标:(20, 20)和(180,140); (2)直线颜色为白色。

3.输出

程序运行结果为一条直线,具体结果如下图所示:

test

整体代码如下:

#include "tgaimage.h"const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255);void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color)
{// Please add the code here/********** Begin ********/int dx = x1 - x0;int dy = y1 - y0;int y = y0;int d = -dx;for(int x = x0;x <=x1;x++){image.set(x,y,color);d = d + 2*dy;if(d >= 0){y++;d = d - 2*dx;}}/********** End *********/
}int main(int argc, char** argv)
{TGAImage image(640,480, TGAImage::RGB);// Please add the code here/********** Begin ********/line( 20, 20 , 180 , 140 , image, white  );/********** End *********/image.flip_vertically(); // i want to have the origin at the left bottom corner of the imageimage.write_tga_file("../img_step2/test.tga");return 0;
}

同样,小Mo还是会把需要填写的代码段po出来哒~

代码段一:

    /********** Begin ********/

    int dx = x1 - x0;

    int dy = y1 - y0;

    int y = y0;

    int d = -dx;

    for(int x = x0;x <=x1;x++)

    {

        image.set(x,y,color);

        d = d + 2*dy;

        if(d >= 0)

        {

            y++;

            d = d - 2*dx;

        }

    }

    /********** End *********/

代码段二:

    /********** Begin ********/   

   line( 20, 20 , 180 , 140 , image, white  );

    /********** End **********/

第4关:直线光栅化-任意斜率的Bresenham画线算法

任务描述:

1.本关任务

(1)根据直线Bresenham算法补全line函数以绘制白色直线,其中直线斜率为任意情况。 (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。

2.输入

代码将自动输入一个OBJ三维人头模型,具体模型如下图:

test

3.输出

若编写的任意斜率的Bresenham画线算法代码正确,则程序会将模型转换为线条图片,具体结果如下图所示:

test

整体代码如下:

#include "tgaimage.h"
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include "model.h"
#include "geometry.h"const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255);
Model *model = NULL;
const int width = 800;
const int height = 800;void line(int x0, int y0, int x1, int y1, TGAImage& image, TGAColor color)
{// Please add the code here/********** Begin ********/bool steep = false;if (abs(x0 - x1) < abs(y0 - y1)){std::swap(x0,y0);std::swap(x1,y1);steep = true;}if (x0 > x1){std::swap(x0,x1);std::swap(y0,y1);}int dx = x1 - x0;int dy = abs(y1 - y0);int y = y0;int d = -dx;for(int x = x0;x <= x1;x++){if(steep)image.set(y,x,color);elseimage.set(x,y,color);d = d + 2*dy;if(d >= 0){y += (y1 > y0 ? 1:-1);d = d - 2*dx;}}/********** End *********/
}int main(int argc, char** argv)
{model = new Model("african_head.obj");TGAImage image(width, height, TGAImage::RGB);for (int i = 0; i < model->nfaces(); i++) {std::vector<int> face = model->face(i);for (int j = 0; j < 3; j++) {Vec3f v0 = model->vert(face[j]);Vec3f v1 = model->vert(face[(j + 1) % 3]);int x0 = (v0.x + 1.)*width / 2.;int y0 = (v0.y + 1.)*height / 2.;int x1 = (v1.x + 1.)*width / 2.;int y1 = (v1.y + 1.)*height / 2.;line(x0, y0, x1, y1, image, white);}}image.flip_vertically(); // i want to have the origin at the left bottom corner of the imageimage.write_tga_file("../img_step3/test.tga");delete model;return 0;
}

同样,小Mo还是会把需要填写的代码段po出来哒~

代码段一:

    /********** Begin ********/

    bool steep = false;

        if (abs(x0 - x1) < abs(y0 - y1))

        {

            std::swap(x0,y0);

            std::swap(x1,y1);

            steep = true;

        }

        if (x0 > x1)

        {

            std::swap(x0,x1);

            std::swap(y0,y1);

        }

        int dx = x1 - x0;

        int dy = abs(y1 - y0);

        int y = y0;

        int d = -dx;

        for(int x = x0;x <= x1;x++)

        {

            if(steep)

                image.set(y,x,color);

            else

                image.set(x,y,color);

            d = d + 2*dy;

            if(d >= 0)

            {

                y += (y1 > y0 ? 1:-1);

                d = d - 2*dx;

            }

        }

    /********** End *********/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/202682.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—raid5上层NTFS分区误删除/格式化的数据恢复案例

NTFS是windows操作系统服务器应用最为广泛的文件系统之一。理论上&#xff0c;NTFS文件系统格式化操作虽然不会对数据造成太大的影响&#xff0c;但是有可能会出现部分文件目录结构丢失的情况。下面介绍一台服务器误操作导致raid5阵列上层的NTFS分区被格式化后如何逆向操作恢复…

【数据结构/C++】栈和队列_链队列

#include <iostream> using namespace std; // 链队列 typedef int ElemType; typedef struct LinkNode {ElemType data;struct LinkNode *next; } LinkNode; typedef struct {LinkNode *front, *rear; } LinkQueue; // 初始化 void InitQueue(LinkQueue &Q) {Q.fron…

信息学奥赛一本通1331:【例1-2】后缀表达式的值

1331&#xff1a;【例1-2】后缀表达式的值 时间限制: 10 ms 内存限制: 65536 KB 提交数: 54713 通过数: 13547 【题目描述】 从键盘读入一个后缀表达式&#xff08;字符串&#xff09;&#xff0c;只含有0-9组成的运算数及加&#xff08;&#xff09;、减&#xf…

vue实现el-menu与el-tabs联动

效果图如下&#xff1a; 当标签栏很多的时候效果图如下&#xff1a; 左侧菜单布局 &#xff08;$route.path高亮显示激活路由 :default-active"$route.path"&#xff09; <el-menu:default-active"$route.path"class"el-menu-vertical-demo"b…

Visual Studio 2022安装教程(千字图文详解),手把手带你安装运行VS2022以及背景图设置

VS2022最新最全安装教程 很高兴你打开了这篇博客&#xff0c;接下来我们一起安装并且使用VS2022吧 文章目录 VS2022最新最全安装教程一.官网下载二.安装启动三.项目测试1.创建新项目2.选择我们使用的模板&#xff08;C空项目&#xff09;&#xff0c;继续冲&#xff01;3.进入…

微信小程序制作

如果你也想搭建一个小程序&#xff0c;但不知道如何入手&#xff0c;那么今天我就教你如何使用第三方制作平台&#xff0c;在短短三十分钟内搭建一个小程序。 一、登录小程序制作平台 首先&#xff0c;登录到小程序制作平台的官方网站或应用程序&#xff0c;进入后台管理系统。…

飞翔的鸟游戏

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 二.代码呈现 pa…

停车管理系统

1 用户信息管理 2 车位信息管理 3 车位费用设置 4 停泊车辆查询 5 车辆进出管理 6 用户个人中心 7 预定停车位 8 缴费信息 9 业务逻辑详解 1 用户停车&#xff1a;user用户登录&#xff0c;在预定停车位菜单&#xff0c;选择一个车位点击预定即可 2 车辆驶出&#xff1a;admin…

excel自己记录

1、清除换行符号 2、添加特殊符号&并清除换行符号 7日&15日&30日&60日 3、判断单元格最后一个字符是不是数字&#xff0c;不是就删掉 IF(ISNUMBER(--RIGHT(B2,1)),B2,SUBSTITUTE(B2,RIGHT(B2,1),"")) ISNUMBER(--RIGHT(B2,1))判断最右边的一个数是否…

模糊C均值聚类(Fuzzy C-means)算法(FCM)

本文的代码与数据地址已上传至github&#xff1a;https://github.com/helloWorldchn/MachineLearning 一、FCM算法简介 1、模糊集理论 L.A.Zadeh在1965年最早提出模糊集理论&#xff0c;在该理论中&#xff0c;针对传统的硬聚类算法其隶属度值非0即1的严格隶属关系&#xff…

基于51单片机音乐盒设计( proteus仿真+程序+原理图+PCB+报告+讲解视频)

音乐盒 主要功能&#xff1a;仿真原理图PCB图程序设计&#xff1a;设计报告实物图资料清单&#xff08;提供资料清单所有文件&#xff09;&#xff1a;资料下载链接&#xff1a; 基于51单片机音乐盒仿真设计( proteus仿真程序原理图PCB报告讲解视频&#xff09; 仿真图proteus …

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…

鸿蒙 ark ui 网络请求 我不允许你不会

前言&#xff1a; 最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 效果图 11-24 16:26:22.005 25156-25156/com.example.httpsrequest E A0ff00/HTTPS: 请求状态 --> 200, %{pub…

C++ STL-----容器

STL容器就是将运用最广泛的一些数据结构实现出来 常用的数据结构&#xff1a;数组, 链表,树, 栈, 队列, 集合, 映射表 等 这些容器分为序列式容器和关联式容器两种: 序列式容器:强调值的排序&#xff0c;序列式容器中的每个元素均有固定的位置。 关联式容器:二叉树结构&…

外部 prometheus监控k8s集群资源(pod、CPU、service、namespace、deployment等)

prometheus监控k8s集群资源 一&#xff0c;通过CADvisior 监控pod的资源状态1.1 授权外边用户可以访问prometheus接口。1.2 获取token保存1.3 配置prometheus.yml 启动并查看状态1.4 Grafana 导入仪表盘 二&#xff0c;通过kube-state-metrics 监控k8s资源状态2.1 部署 kube-st…

onnx模型转换opset版本和固定动态输入尺寸

背景&#xff1a;之前我想把onnx模型从opset12变成opset12&#xff0c;太慌乱就没找着&#xff0c;最近找到了官网上有示例的&#xff0c;大爱onnx官网&#xff0c;分享给有需求没找着的小伙伴们。 1. onnx模型转换opset版本 官网示例&#xff1a; import onnx from onnx im…

C++多线程学习(二):多线程通信和锁

参考引用 C11 14 17 20 多线程从原理到线程池实战代码运行环境&#xff1a;Visual Studio 2019 1. 多线程状态 1.1 线程状态说明 初始化 (lnit)&#xff1a;该线程正在被创建就绪 (Ready)&#xff1a;该线程在就绪列表中&#xff0c;等待 CPU 调度运行 (Running)&#xff1a;…

Linux运行jmeter报错java.sql.SQLException:Cannot create PoolableConnectionFactory

在性能测试过程中遇见1个问题&#xff0c;终于解决了&#xff0c;具体问题如下。 问题 在windows电脑写jmeter脚本连接数据库连接成功 然后把该脚本放到Linux服务器上面&#xff0c;并把jmeter mysql驱动放到服务器上面&#xff0c;修改jmeter的mysql驱动路径信息 注意&…

【C++高阶(一)】二叉搜索树深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 这里写目录标题 1. 前言2. 二叉搜索树的概念以及…

【Spring源码】Spring Event事件

目录 1、前言 2、什么是Spring Event&#xff1f; 3、基本使用 3.1、定义事件 3.2、发布事件 3.3、监听事件 3.3.1、继承ApplicationListener 3.3.2、使用EventListener注解 4、Spring Event是同步还是异步&#xff1f; 4.1、源码实现 4.2、如何实现异步 4.2.1、使用…