热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为何画出的线不是平滑的?

为何画出的线不是平滑的?procedureTForm1.Button2Click(Sender:TObject);beginself.Canvas.pen.Styl
为何画出的线不是平滑的?
procedure TForm1.Button2Click(Sender: TObject); 
begin 
        self.Canvas.pen.Style:=pssolid; 
        self.Canvas.pen.Width:=1; 

      self.Canvas.PolyBezier([Point(10, 210), Point(30, 10), 
                              Point(130, 130), Point(240,120),Point(340, 220),Point(440, 620),Point(10, 210)]); 
end; 

6 个解决方案

#1


屏幕上的点都是整数点,当然不能平滑
不过可以用一些平滑算法,做到近似平滑

#2


mark

#3


如何做?

#4


PolyBezier函数好象只能做三个控制点的贝赛尔曲线..

#5


下载一下这个例子看看吧..这才是真正的贝赛尔曲线的算法..
[老外写的Delphi的贝赛尔曲线的算法..我感觉不大好..但总好过没有吧..-_-!..你适当改改吧]
http://www.triplexware.huckfinn.de/src/geom_api/bezier.zip

#6


反走样线的画线函数:
procedure AALine(x1,y1,x2,y2 : single; color : tcolor; canvas : tcanvas);
function CrossFadeColor(FromColor,ToColor : TColor; Rate : Single) : TColor; 
var r,g,b : byte; 
begin 
  r:=Round(GetRValue(FromColor)*Rate+GetRValue(ToColor)*(1-Rate)); 
  g:=Round(GetGValue(FromColor)*Rate+GetGValue(ToColor)*(1-Rate)); 
  b:=Round(GetBValue(FromColor)*Rate+GetBValue(ToColor)*(1-Rate));
  Result:=RGB(r,g,b); 
end; 
procedure hpixel(x : single; y : integer); 
var FadeRate : single; 
begin 
  FadeRate:=x-trunc(x); 
  with canvas do 
  begin 
    pixels[trunc(x),y]:=CrossFadeColor(Color,Pixels[Trunc(x),y],1-FadeRate); 
    pixels[trunc(x)+1,y]:=CrossFadeColor(Color,Pixels[Trunc(x)+1,y],FadeRate); 
  end; 
end; 

procedure vpixel(x : integer; y : single); 
var FadeRate : single;
begin 
  FadeRate:=y-trunc(y); 
  with canvas do 
  begin 
    pixels[x,trunc(y)]:=CrossFadeColor(Color,Pixels[x,Trunc(y)],1-FadeRate); 
    pixels[x,trunc(y)+1]:=CrossFadeColor(Color,Pixels[x,Trunc(y)+1],FadeRate); 
  end; 
end; 

var i : integer; 
    ly,lx,currentx,currenty,deltax,deltay,l,skipl : single; 
begin
  if (x1<>x2) or (y1<>y2) then
  begin 
    currentx:=x1; 
    currenty:=y1; 
    lx:=abs(x2-x1); 
    ly:=abs(y2-y1); 

    if lx>ly then
    begin 
      l:=trunc(lx); 
      deltay:=(y2-y1)/l; 
      if x1>x2 then
      begin
        deltax:=-1; 
        skipl:=(currentx-trunc(currentx));
      end else 
      begin 
        deltax:=1; 
        skipl:=1-(currentx-trunc(currentx)); 
      end; 
    end else
    begin 
      l:=trunc(ly); 
      deltax:=(x2-x1)/l; 
      if y1>y2 then
      begin 
        deltay:=-1; 
        skipl:=(currenty-trunc(currenty)); 
      end else 
      begin 
        deltay:=1; 
        skipl:=1-(currenty-trunc(currenty)); 
      end;
    end;

    currentx:=currentx+deltax*skipl;
    currenty:=currenty+deltay*skipl;{}

    for i:=1 to trunc(l) do
    begin
      if lx>ly then vpixel(trunc(currentx),currenty) else hpixel(currentx,trunc(currenty));
      currentx:=currentx+deltax;
      currenty:=currenty+deltay;
    end;
  end;
end;


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
author-avatar
椒桥头_671
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有