图形的拾取(100分)

  • 主题发起人 主题发起人 rabbitm
  • 开始时间 开始时间
有一个函数FindVCLWindow,
一个很有用的函数呀,可以用于单击多选(类似于在Delphi中Shift + LeftButton)
如果用框选的话,也可以呀,简单而笨但较易实现的方法是建立一个界面上所有对象
的列表(包括位置信息和其它信息),慢慢判断呗(其实也可以通过排序来使这样做
更快!)
在《程序员大本营》中有一个韩国人写的类似DelphiIDE的程序,不过你所关心的
部分没有源代码(也难怪嘛),不过他提供了一个可执行程序!看看吧,有帮助!
 
哈哈, 这个问题还在这里没有解决么。

这本来是计算机图形学中最基本的算法了,不过好像很多人还不知道什么是图形拾取,
甚至把图形、图像混为一谈。所谓图形是指用线框进行几何作图,比如说CAD一类的;图像
指得是点阵图,如Bitmap...。

图形拾取是在屏幕上检测标点设备是否检索到某个几何形体,如直线、圆弧...。至于检测
某些像素的集合,应该是图像处理中的图像识别问题了。

图形拾取的算法很多,概念上最简单的是判断一点到一条线断的距离是否在给定的范围
之内。当然概念简单的程序可能算起来比较慢,所以引申出来很多不同的算法。不论是那
种算法,第一个步骤都要判断“点“是否在“线段矩形“范围之内,如果在,在判断接近
程度。这里我给出点线距离算法,其他算法可以随便照一本计算机图形学的书看看:

function PointNearLine(const P, P1, p2: TPoint; D: integer): boolean;
var l, w: double;
begin
if (p.x > min(p1.x,p2.x)-d) and (p.x < max(p1.x,p2.x)+d) and
(p.y > min(p1.y,p2.y)-d) and (p.y < max(p1.y,p2.y)+d) then
begin
l := Sqrt(Sqr(p2.x-p1.x)+Sqr(p2.y-p1.y)); //length of the line
w := abs((p1.y-p2.y)*(p.x-p1.x)-(p1.x-p2.x)*(p.y-p1.y));
result := (w/l <= d);
end
else result := false;
end;
 
有多种办法:
1.在作图时,一面在Cancas上输出,一面在一个二维数组上输出,标记一个ID值。
这样,可以根据二维数组的ID值找到图形,进而取得图形参数。但这个办法较笨。
2.在作图时,不管是矩形、多边形、圆、曲线......都对其标记其所占区域(采
用矩形即可),记入一个动态数组,排序。要取出图形时,先判断那些区域包含此
点,然后再逐个求距离,找出最近的,即可。
具体的算法较难,只要数学过关,应该可以解决。

huizhang的说法是对的。
 
接受答案了.
 
后退
顶部