高难度问题,同时测试一下大富翁的人气:如何选中一条不规则曲线比如Bezier曲线?(200分)

  • 主题发起人 borlandor
  • 开始时间
B

borlandor

Unregistered / Unconfirmed
GUEST, unregistred user!
如何选中一条不规则曲线比如Bezier曲线,即判断光标是否落在这根线上。
假设画这条曲线时的Pen的宽度为2,如下:


procedure TForm1.Button2Click(Sender: TObject);
var Points: array[0..3] of TPoint;
begin
Canvas.Pen.Width := 2;
Points[0] := Point(100,200);
Points[1] := Point(200,100);
Points[2] := Point(300,300);
Points[3] := Point(400,200);
Canvas.PolyBezier(Points);
end;

多多指点,谢谢!
[?]
 
我不知道,可是我想知道。
 
添点人气
 
我的Bezier是我自己画的,通过控制点生成一系列的点数组来模拟Bezier,也就是说最后画
出来的Bezier线其实是LineTo弄出来的,所以就不存在这个问题了,效果嘛,绝不比Windows
的PolyBeizer的差。
 
用一个空白的 Canvas 作幕后工具,在你的 界面上画的时候也在这个 Canvas 上画一下
再计算一下光标位置,取得 Canvas 上的对应点的颜色即可知道
 
把图线经过的点储存(比如说数组中),在button click时判断点击时判断这个点是否被储存
 
大翁们能否具体点,拜托了!
 
你是不是要作一个自己画图的软件,然后可以用鼠标调整线条?
在Windows里面有一个Path,还有个Region,Win32的帮助库中有这个的说明和API函数,
按照我的理解这个可以做到鼠标移动到顶上自动识别的效果。我也没有用这个做过程序
不过是两个月前研究的一些东西,希望能有所帮助,欢迎来信探讨lofa@263.net。
在Rigion顶上鼠标肯定可以识别
 
我知道对于一根有宽度的曲线通过BeginPath,PolyBezier,EndPath,PathToRegion可以得出
一个封闭区域,但这个区域是它所围起来的面积,而不是这根线本事因它的线宽所占的区域。
如果有现成的API函数得出一根有宽度的曲线或折线本事所占据的区域,那就最省事了,
但好象没有这样的东西。。。。。。
 
可以把这个曲线用同样的方式画到一个Bitmap上,不过用Black颜色画,这个临时Bitmap的长宽和你画曲线的长宽一样,并预先用白色填充
然后判断这个点在这个Bitmap上的颜色是否是Black,如果是表示是在线上,否则不是!
 
谢谢aizb!
但这样做可能速度比较慢?
 
是的,因为需要创建同样大小的位图,并且要先绘制,所以这样的结果会造成速度比较慢,对于大量数据不能用这种方法,
大量数据可能需要通过Bezier曲线方程式计算出这条Bezier上的每一个点并与已知点来比较,如果有线宽,
还需要在计算时考虑线宽,这样做当然比较麻烦.
 
你需要在麻烦和速度之前作出一个选择!
 
没有答案
 
顶部