📅  最后修改于: 2020-12-20 03:54:54             🧑  作者: Mango
一条直线可以由两个端点和一个方程式定义。在图1中,两个端点由(x 1 ,y 1 )和(x 2 ,y 2 )描述。直线方程式用于确定这两个端点之间所有点的x,y坐标。
使用直线方程,y = mx + b其中m = &b = y中断,我们可以通过将x从x = x 1递增到x = x 2来找到y的值。通过对这些计算出的x,y值进行扫描转换,我们将线条表示为像素序列。
1.线应显示为直线:我们必须通过选择靠近线的可寻址点来使线合适。如果选择正确,该线将显示为直线,否则,将产生交叉线。
这些线必须与x和y轴平行或成45°角生成。其他线会引起问题:通过它的线段在可寻址点处开始和结束,可能恰好没有经过它们之间的其他可寻址点。
2.线应准确终止:除非精确绘制线,否则它们可能在错误的位置终止。
3.线应具有恒定的密度:线密度与编号成正比。显示的点数除以线的长度。
为了保持恒定的密度,点应均匀分布。
4.线密度应独立于线长和角度:这可以通过计算近似线长估计值并使用线生成算法来实现,该算法将线密度保持在此估计精度范围内。
5.线应迅速画出:此计算应由专用硬件执行。
这是最简单的转换形式。首先扫描P 1和P 2点。第1页具有坐标(X 1 'Y 1 ')和(x 2' Y 2')。
然后m =(y 2 ',y 1 ')/(x 2 ',x 1 ')和b =
对于x的每个整数值,如果| m |≤1的值。但是不要考虑
对于每个y整数值,如果| m |> 1的值。但是不要考虑
示例:给出了一条起点为(0,0)和终点(6,18)的线。计算中间点的值和直线的斜率。
解决方案: P 1 (0,0)P 7 (6,18)
x 1 = 0
y 1 = 0
x 2 = 6
y 2 = 18
我们知道线的方程是
y +="" .............方程(1)<="" =="" b="" b
="" mx="" p="" y="3x">
将x的值从等式(1)的初始点开始放置,即(0,0)x = 0,y = 0
+="" 0="b⟹b" 0<="" =="" b
="" p="" x="">
将b = 0代入等式(1)
+="" 0
="" y="3x
现在计算中间点
令x 1="" 2="" 3="" 4="" 5="" 6="" =="" x="" y="18
所以点是P 1 (0,0)
P 2 (1,3)
P 3 (2,6)
P 4 (3,9)
P 5 (4,12)
P 6 (5,15)
P 7 (6,18)
步骤1:开始算法
步骤2:声明变量x 1 ,x 2 ,y 1 ,y 2 ,dx,dy,m,b,
步骤3:输入x 1 ,x 2 ,y 1 ,y 2的值。
(x 1 ,y 1 )是线的起点的坐标。
(x 2 ,y 2 )是线的终点的坐标。
步骤4:计算dx = x 2 -x 1
步骤5:计算dy = y 2 -y 1
步骤6:计算m =
步骤7:计算b = y 1 -m * x 1
步骤8:将(x,y)设置为等于起点,即,最低点和x end等于x的最大值。
如果dx <0
然后x = x 2
y = y 2
x末端= x 1
如果dx> 0
那么x = x 1
y = y 1
x末端= x 2
步骤9:如果x = x end ,请检查是否已画出整条线,然后停止
步骤10:在当前(x,y)坐标上绘制一个点
步骤11:递增x的值,即x = x + 1
步骤12:根据方程式y = mx + b计算y的下一个值
步骤13:转到步骤9。
#include
#include
#include
#include
#include
#include
class bresen
{
float x, y, x1, y1, x2, y2, dx, dy, m, c, xend;
public:
void get ();
void cal ();
};
void main ()
{
bresen b;
b.get ();
b.cal ();
getch ();
}
Void bresen :: get ()
{
print ("Enter start & end points");
print ("enter x1, y1, x2, y2");
scanf ("%f%f%f%f",sx1, sx2, sx3, sx4)
}
void bresen ::cal ()
{
/* request auto detection */
int gdriver = DETECT,gmode, errorcode;
/* initialize graphics and local variables */
initgraph (&gdriver, &gmode, " ");
/* read result of initialization */
errorcode = graphresult ();
if (errorcode ! = grOK) /*an error occurred */
{
printf("Graphics error: %s \n", grapherrormsg (errorcode);
printf ("Press any key to halt:");
getch ();
exit (1); /* terminate with an error code */
}
dx = x2-x1;
dy=y2-2y1;
m = dy/dx;
c = y1 - (m * x1);
if (dx<0)
{
x=x2;
y=y2;
xend=x1;
}
else
{
x=x1;
y=y1;
xend=x2;
}
while (x<=xend)
{
putpixel (x, y, RED);
y++;
y=(x*x) +c;
}
}
输出:
Enter Starting and End Points
Enter (X1, Y1, X2, Y2) 200 100 300 200