我正在尝试为 dy>dx 编写一个 bresenhams 程序。我们的老师告诉我们用 C++ 编写 bresenhans 画线程序,它将满足所有可能的条件,她认为我们通过提供此公式的
来为 dx>dy 提供算法
- G=G+2*dy-2dx;
- G=G+2*dy;
把项目的其余部分留给我们作为研究或 H.W.
不过,我已经使用算法想出了这个程序(仅适用于 dx>dy)。我只是想知道这些公式是否足以用于后面的部分,或者需要进行哪些修改?
#include<conio.h>
#include<iostream.h>
#include<stdio.h>
#include<graphics.h>
#include<math.h>
void main()
{
int i,x,y,x0,y0,x1,y1,G,dx,dy,gd=DETECT,gm;
initgraph(&gd,&gm,"d://tc//bgi//");
cout<<" Enter the first coordinate of a line : ";
cin>>x0>>y0;
cout<<"Enter the last coordinate of a line : ";
cin>>x1>>y1;
dx=x1-x0;
dy=y1-y0;
dx=abs(dx);
dy=abs(dy);
putpixel(x0,y0,WHITE);
G=2*dy-dx;
x=x0;y=y0;
if(dx>=dy)
{
for(x=x+1;x<=x1;x++)
{
if(G>0)
{
y=y+1;
G=G+2*dy-2*dx;
}
else
{
G=G+2*dy;
}
putpixel(x,y,WHITE);
}
}
实际上 dy>dx
和 dx>dy
是一样的。但是您可能应该检查给出分数的顺序。我会怎么做:
考虑 start
和 end
是输入点,mem
是给定的帧缓冲区(或图像或其他)中像素的索引宽度
和高度
。
k = d_y / d_x;
if (-1 <= k && k <= 1) {
c0 = 2 * abs(d_y);
c1 = c0 - 2 * abs(d_x);
p = c0 - abs(d_x);
if (start->x <= end->x) {
for (int i = start->x + 1; i < end->x; ++i) {
if (p < 0) {
p += c0;
++mem;
} else {
p += c1;
if (k >= 0) {
mem += width + 1;
} else {
mem += (1 - width);
}
}
colorBuffer[mem] = currentColor;
}
} else {
for (int i = start->x - 1; i > end->x; --i) {
if (p < 0) {
p += c0;
--mem;
} else {
p += c1;
if (k >= 0) {
mem -= width + 1;
} else {
mem += width - 1;
}
}
colorBuffer[mem] = currentColor;
}
}
}
else {
c0 = 2 * abs(d_x);
c1 = c0 - 2 * abs(d_y);
p = c0 - abs(d_y);
//this is the same as dx >= dy, just switch x and y
...
我是一名优秀的程序员,十分优秀!