gpt4 book ai didi

c++ - 如何为 dy>dx 编写 bresenhams 画线程序?

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:41 26 4
gpt4 key购买 nike

我正在尝试为 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>dxdx>dy 是一样的。但是您可能应该检查给出分数的顺序。我会怎么做:

考虑 startend 是输入点,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
...

关于c++ - 如何为 dy>dx 编写 bresenhams 画线程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21532319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com