用C++画坐标轴或直线

注:我的开发环境是vs2013,所以需要手动配置EasyX图形库,还没配置图形库的可以参考我的另一片文章


一、配置好图形库(可以参考我那篇EasyX图形库配置的文章)


二、开始编码

#include"stdafx.h"
#include<conio.h>
#include<graphics.h>                    //头文件为graphics.h
int main()
{
    initgraph(500,500);             //使用initgraph函数进行图形初始化
    line(100, 300, 300, 300);       //使用line函数画横线
    moveto(300, 0);                 //移动游标到(350,0)点
    linerel(0, 300);                        //使用linerel函数画竖线
    lineto(200, 200);                   //使用lineto函数画斜线
    _getch();                                  //按任意键继续
    closegraph();                           //退出图形状态
} 

三、查看运行效果
这里写图片描述

/*=============================================== 作者:LXZ-2008 FROM:CUMT 计08级 时间:2012-04-22 功能:能在SDK、MFC编程中实现笛卡尔 坐标系统的绘制,以及曲线,点的绘制。 特性:1.本程序采用面向对象思想设计; 2.具备很好的独立性,随时可以把这两个文件应 用在任意SDK、MFC开发中; 3.有良好的灵活性,扩展性,易用性,在稍微扩 展一下可以绘制任意曲线,形; 4.具备良好的组合性,符合模块内高内聚,模块 外低耦合的思路; 5.整个程序仅有1300行左右代码,如果嫌代码过 多,可以把原先变量的PROTECTED保护类型打开, 换成PUBLIC,这样去掉GET和SET函数,这个思路 起源于我对J2EE中STRUTS2框架的学习以及对COM 组件技术的了解,它们也是这种思路这时可以省 下几百行代码。 6.当然也会有设计模式的思路在里面。 个人说明: 本程序花了我将近2天的时间编写,尽管开始有点 不想,但是还是觉得有意义,能给广大网友提供益处。 本系统的雏形来自2010年下半年的程序,当时花了 10天时间,弄了3千行代码。在现在看来当时的程序的 执行效率未必比现在的低,但是可维护性糟糕,可拓展 性糟糕,不具备良好的灵活性。需求改变了,代码会大 幅改变。换句话说,现在看来当时的程序是十分糟糕的, 生命周期已经结束。 而在用了面向对象的思想和设计模式,以及一些数 据结构去重新搭建这个系统的时候,代码其实1千多行就 搞定了,时间3-4天,不需要那么多(现在我来弄的话)。 主要起源于自己参与真实的有数十万代码的项目的开发, 这样提高了对程序开发的认识,以及商业程序应该如何 开发。同时也是自己面向对象思想和设计模式学习,对 自身思想的提高。 希望阅读代码的人觉得这些代码是优雅的,这就满 足了,尽管注释少了些,你们自己加吧。 QQ:706625262 E-MAIL:706625262@qq.com 不做商业和技术支持。 声明: 本程序代码未经本人同意,或者未给我MONEY的前提下, 不得用于商业目的,别让我鄙视你。在非商业目的使用 下请注明本人是原创,表学腾讯。 ==================================================*/
### 回答1: 以下是一个简单的用DDA算法绘制任意直线的C语言代码示例: ``` #include <graphics.h> // 引用形库 int main() { int gd = DETECT, gm; initgraph(&gd, &gm, ""); // 初始化形界面 // 获取两个端点的坐标 int x1, y1, x2, y2; printf("请输入第一个端点的坐标(x1,y1):"); scanf("%d,%d", &x1, &y1); printf("请输入第二个端点的坐标(x2,y2):"); scanf("%d,%d", &x2, &y2); int dx = x2 - x1; int dy = y2 - y1; float m = dy / (float)dx; // 斜率 // 根据斜率的正负情况判断增量值 float x_increment, y_increment; if (m > 0 && m <= 1) { x_increment = 1; y_increment = m; } else if (m > 1) { x_increment = 1 / m; y_increment = 1; } else if (m < 0 && m >= -1) { x_increment = 1; y_increment = m; } else if (m < -1) { x_increment = -1 / m; y_increment = -1; } else { x_increment = 0; y_increment = 0; } float x = x1, y = y1; putpixel(x, y, WHITE); // 迭代绘制直线 while (x < x2 || y < y2) { x += x_increment; y += y_increment; putpixel(x, y, WHITE); } getch(); closegraph(); return 0; } ``` 注意,此代码仅为示例,可能需要根据具体的编译环境和形库进行适当的修改才能正常编译和运行。 ### 回答2: DDA(Digital Differential Analyzer)算法是一种数字微分分析算法,通过计算增量来实现任意直线的绘制。下面是使用DDA算法绘制任意直线的代码: ```c #include<stdio.h> #include<graphics.h> void DDA(int x1, int y1, int x2, int y2){ int dx = x2 - x1; int dy = y2 - y1; int steps; // 计算斜率的绝对值 if(abs(dx) > abs(dy)){ steps = abs(dx); } else { steps = abs(dy); } // 计算每个步骤中x和y的增量 float xIncrement = dx / (float) steps; float yIncrement = dy / (float) steps; // 初始位置为起点的坐标 float x = x1; float y = y1; // 迭代绘制直线上的每个像素 for(int i = 0; i < steps; i++){ putpixel(x, y, WHITE); x += xIncrement; y += yIncrement; } } int main(){ int gd = DETECT, gm; initgraph(&gd, &gm, ""); int x1, y1, x2, y2; printf("输入直线起点坐标(x1, y1): "); scanf("%d %d", &x1, &y1); printf("输入直线终点坐标(x2, y2): "); scanf("%d %d", &x2, &y2); DDA(x1, y1, x2, y2); delay(5000); closegraph(); return 0; } ``` 在代码中,我们首先计算了x和y的增量,然后使用循环来迭代计算每一个增量点的坐标,并使用`putpixel`函数在该坐标位置绘制一个像素。最后通过输入起点和终点坐标,在形窗口上绘制任意直线。 需要注意的是,上述代码是使用C语言和形库编写的,因此需要安装相应的形库。 ### 回答3: DDA(Digital Differential Analyzer)算法是一种基于增量的直线绘制算法。下面是使用DDA算法绘制任意直线的代码: ```python import matplotlib.pyplot as plt def draw_line(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 steps = abs(dx) if abs(dx) > abs(dy) else abs(dy) x_increment = dx / steps y_increment = dy / steps x = x1 y = y1 points = [] for i in range(steps+1): points.append((round(x), round(y))) x += x_increment y += y_increment return points # 测试代码,绘制直线从点(1, 1)到点(5, 4) line_points = draw_line(1, 1, 5, 4) x = [point[0] for point in line_points] y = [point[1] for point in line_points] plt.plot(x, y) plt.show() ``` 以上代码首先计算出两个点(x1, y1)和(x2, y2)之间的横向增量dx和纵向增量dy。接着,根据dx和dy的绝对值大小来决定绘制直线所需的步数steps,以绝对值较大者为准。然后,计算每一步横向和纵向的增量。接下来,使用一个循环对每一步进行计算和绘制,按照增量逐步移动起始点(x1, y1)并记录中间点。最后,返回所有绘制点的列表。 测试代码中将绘制一条从点(1, 1)到点(5, 4)的直线,然后使用matplotlib库将直线绘制出来。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值