【问题标题】:Bresenham's line drawing in Delphi - problems with Sign(x) functionBresenham 在 Delphi 中的线图 - Sign(x) 函数的问题
【发布时间】:2010-10-15 12:08:08
【问题描述】:

我的任务是使用 Bresenham 的线条绘制算法绘制 8 条线,形成类似于常规 8 点星形的东西。它是用德尔福语言完成的。由于我不太擅长画布绘图,因此我只是从 Wikipedia 中复制粘贴了 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”语句。请您解释一下卑微的初学者,为什么会发生这种情况?

附:通过将第 4 条“else”语句更改为 Result in 1,我让该程序正常工作,但仍然对这种情况感到困惑。

提前谢谢你。

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    您在第二个 if 之前缺少一个 else。所以 0 既属于 =0 的情况,也属于 >0 的 else 情况。

    function Sign(x:integer):integer;
    begin    
        if x=0 then  Result:=0
        else if x>0 then Result:=1
        else Result:=-1;
    end;
    

    并且在数学单元中有一个符号函数。

    您可以使用参数 -2,-1,0,+1,+2 测试您的函数,看看会发生什么。

    【讨论】:

    • @Norvind,不要问谷歌 Delphi 有什么功能。问德尔福。使用您最喜欢的文本搜索工具在 Delphi 源文件中搜索您感兴趣的功能。Delphi 带有一个grep 命令行工具,它的“在文件中查找”GUI 命令也可以使用。跨度>
    • 除了 Rob Kennedy 的评论之外,我发现它非常很有帮助,在 Windows 7 中,1) 在 Windows 搜索索引中包含 Source\Win32 子文件夹,并且2) 在纯文本模式文件类型类别中包含 *.pas 文件,以便我可以通过按下 Windows 按钮并输入其名称的第一个字母来搜索(包含)标识符的源文件。
    • 但是在这种情况下——签名函数在Delphi中被称为sign是不是很奇怪?在math 单元中定义它是否令人惊讶?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多