我的任务是绘制八条线,形成类似普通八角星的东西,使用Bresenham的线绘制算法。它是用Delphi语言完成的。由于我不擅长画布绘图,我只需将维基百科中的算法复制粘贴到Object Pascal,只需进行最少的更改。
但是维基百科算法具有Sign(x)函数,Delphi标准库中没有这个函数,所以我必须自己编写:
function Sign(x:integer):integer;
begin
if x=0 then Result:=0;
if x>0 then Result:=1;
else Result:=-1;
end;
一切正常,但我只能在前两个象限中操作,其他坐标都是镜像的。 我更改了功能以显示错误:
function Sign(x:integer):integer;
begin
if x=0 then Result:=0;
if x>0 then Result:=1;
if x<0 then Result:=-1 else begin
Form1.Label5.Caption:='Err!';
Result:=2;
end;
end;
我使用了以下功能:
sx:=Sign(x1-x0);
sy:=Sign(y1-y0);
x0,x1,y0,y1是线的起点和终点的坐标。我很困惑,似乎有时x1-x0和y1-y0并非不小于,大于或等于零,但属于第4个'else'语句。你能解释一下这个不起眼的初学者,为什么会这样?
P.S。我通过将第4个'else'语句更改为Result in 1来使该程序正常工作,但仍然对这种情况感到困惑。
提前谢谢。
答案 0 :(得分:4)
你在第二个之前错过了其他的if。所以0都落入= 0的情况和&lt; 0的其他情况。
function Sign(x:integer):integer;
begin
if x=0 then Result:=0
else if x>0 then Result:=1
else Result:=-1;
end;
数学单元中有一个Sign功能。
你可以用参数-2,-1,0,+ 1,+ 2测试你的函数,看看会发生什么。