目录
1. 说明
2. 实现
3. 完整测试代码
1. 说明具体的bresenham算法可以参考https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html,这里介绍的是一种基于该算法的实现方式。为什么说是最简洁的实现的看下面的代码实现就知道了,短短不到三十行代码便可以实现全坐标系任意斜率直线的绘制。
这里采用了虚拟轴的概念,因而使得可以屏蔽斜率的概念可以使得所有的直线绘制都转化为第一象限斜率小于1情况下的直线绘制。因此所有的判定条件只有一个e+dy-0.5dx
2. 实现std::vector bresenham(Point start_point, Point end_point) {
std::vector res;
Point pos = start_point;
int direction_x = end_point.x - start_point.x;
int direction_y = end_point.y - start_point.y;
int delta_x = fabs(direction_x);
int delta_y = fabs(direction_y);
int max_xy = ((delta_x > delta_y) ? delta_x : delta_y);
int decision_param_x = - (max_xy / 2);
int decision_param_y = decision_param_x;
res.push_back(start_point);
for(int i = 0; i < max_xy; ++i) {
//处理x
decision_param_x += delta_x;
if(decision_param_x > 0) {
direction_x > 0 ? pos.x++ : pos.x--;
decision_param_x -= max_xy;
}
//处理y
decision_param_y += delta_y;
if(decision_param_y > 0) {
direction_y > 0 ? pos.y++ : pos.y--;
decision_param_y -= max_xy;
}
res.push_back(pos);
}
return res;
}
以上便是该算法实现的全部内容,可以很容易移植到不同的测试环境中测试。下图是在windows平台终端下的测试结果。
以下为完整的测试代码:
#include
#include
#include
#include
typedef struct
{
int x;
int y;
}Point;
Point start_point = {15, 15};
Point end_point = {8, 0};
std::vector bresenham(Point start_point, Point end_point) {
std::vector res;
Point pos = start_point;
int direction_x = end_point.x - start_point.x;
int direction_y = end_point.y - start_point.y;
int delta_x = fabs(direction_x);
int delta_y = fabs(direction_y);
int max_xy = ((delta_x > delta_y) ? delta_x : delta_y);
int decision_param_x = - (max_xy / 2);
int decision_param_y = decision_param_x;
res.push_back(start_point);
for(int i = 0; i < max_xy; ++i) {
//处理x
decision_param_x += delta_x;
if(decision_param_x > 0) {
direction_x > 0 ? pos.x++ : pos.x--;
decision_param_x -= max_xy;
}
//处理y
decision_param_y += delta_y;
if(decision_param_y > 0) {
direction_y > 0 ? pos.y++ : pos.y--;
decision_param_y -= max_xy;
}
res.push_back(pos);
}
return res;
}
void gotoXY(int x, int y)
{
COORD cd;
cd.X = x;
cd.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}
int main(void)
{
std::vector point_set = bresenham(start_point, end_point);
system("cls");
for(int i = 0; i < point_set.size(); ++i)
{
gotoXY(point_set[i].x, point_set[i].y);
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?