作者ccbruce (今、そこに いる仆)
看板Prob_Solve
标题[问题] 请问一下Polygon Clipping的相关演算法
时间Wed Mar 5 22:08:10 2008
有没有网站有比较多这方面的参考资料。
是这样的,因为我想要在写出一个视窗能「半透明」的程式。在Vista有DWM可用;在WinXP
虽有Layered Window可用,但是并不好用,老实讲,很难用。
如果要回归传统,就要想办法抓出「盖在半透明视窗下面的所有视窗」的画面,把它们一
个个地由下往上叠,再画上自己视窗的半透明背景来得到半透明效果。
虽然这样的想法很简单,但是速度太慢,如果下面只有1, 2个视窗那还好,如果有10几个
就会非常慢,所以必须有比较快的演算法来决定底下有哪些视窗该抓,哪些不用。
我的构想是把目前视窗的Rectangle当成Subject Polygon,而把下面每个视窗的Rectangle
当成Clipping Polygon,然後执行以下的回圈:
Let S=The rectangle of my window
Let B=() ;The ordered set of windows
For each below window W
Let C=The rectangle of W
If Intersection(S, C)=Empty Set Then
Continue
S=S-Intersection(S, C)
B=B+W
If S=Empty Set Then
End Loop
Next
Return B
这里想到可以加速的地方有:
1.跳过没交集的视窗
2.Clipping Polygon永远是矩形
最後,虽然我找到不少演算法是可以把它们交集算出来的,却不知道怎麽样才可以作到差
集。如果可以,我还想知道怎麽算联集,这样可以试另外的做法。
--
爱 哀 だ 百 は こ も こ
し し か 亿 か ん ろ ん
い い ら 年 な な く な
ほ の い に に
ど 年 も も
に 月
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.115.146.83
※ ccbruce:转录至看板 CSSE 03/05 22:10
1F:推 yoco315:你可以直接设定透明度 XD 03/05 23:45
2F:推 slanla:API : SetLayeredWindowAttributes 2000以上作业系统 03/06 16:45
3F:→ slanla:1 03/06 16:46
4F:→ slanla:或是隐藏...用GetDC不是会比较快吗~@@? 03/06 16:46
5F:→ ccbruce:SetLayered那个不能用半透明,GetDC不能跨行程 03/06 19:49
6F:→ ccbruce:要取得别的行程的画面要用GetPrintDC或是用Hook 03/06 19:50