如何获得用canvas里的方法化的图形所经过的点的坐标?火急!关系到我的生死!(200分)

  • 主题发起人 主题发起人 不再
  • 开始时间 开始时间

不再

Unregistered / Unconfirmed
GUEST, unregistred user!
我想判断我用Tcanvas里的方法画出来的图形外框是否经过canvas上的某一矩形区域
(如rec(x1,y1,x2,y2)是不是一定要得到我所画的图形外框的线条的轨迹
呢?我说的图形包括所有画笔能画的图形!
希望各位高手可怜可怜我!这个东西做不出来我所在的开发小组都要下岗了!
最好能在12月15号以前有结果。谢谢,谢谢啦!
我所有的分都送给你们了!
 
一个笨方法:
在内存在中建立一个相同大小的bitmap,在bitmap.canvas上进行绘图,然后判断矩形中是否有图元。

 
详细点好吗?谢谢!200分归你!
 
既然你的图形都是用Canvas的方法画出来的,那这些基本图形都应该可以用CreateRectRgn、
CreatePolygonRgn等这样的API创建出来,那就把各个基本图形创建出来再画,或者至少把
每个基本图形的区域都记下来——这样做的目的是得到每个区域的句柄,用CombineRgn把它们
依次并起来,最终可以得到一个大的区域句柄,最后用RectInRegion判断,就是:
BOOL RectInRegion(
HRGN hrgn, // 最终整个图形的区域句柄
CONST RECT *lprc // 要判断的矩形(就是那个rect(x1,y1,x2,y2))
);
试一下,我没做过,不敢保证:)
 
to dq
谢谢你!不过我对api调用不是很会!我知道canvas里的方法都是用的api里的函数,
但是被封装起来了。你可能误会我的意思了,我要判断的不是矩形是否在图形里面
而是所画的图形的边框是否通过这个矩形,这个矩形是我事先画出来的珊各中的一格。
还请帮忙帮到底!还有,你对johnson Guo 的办法怎么看?我觉得可行,只是不知道
如何具体实施。
 
var
Bmp: TBitmap;
Ptr: PByteArray;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := Image.Width;
Bmp.Height := Image.Height;
Bmp.PixelFormat := pf24Bit;
with Bmp.Canvas do begin
Brush.Color := clWhite;
FillRect(ClipRect);
//在Bmp.Canvas画你要画的东西
for i := Rect.Top to Rect.Bottom - 1 do begin
Ptr := Bmp.ScanLine;
for j := Rect.Left to Rect.Right - 1 do
if (Ptr[j * 3] <> 255) or (Ptr[j * 3 + 1] <> 255) or
(Ptr[j * 3 + 2] <> 255) then
//你画的操作经过该矩阵啦。
end;
end;
finally
Bmp.Free;
end;
end;
 
to 不再:
呵呵,我想我没有误会你的意思,API里对RectInRegion的解释是:
The RectInRegion function determines whether any part of the specified rectangle is within the boundaries of a region.
~~~~~~~~
If any part of the specified rectangle lies within the boundaries of the region, the return value is nonzero.
~~~~~~~~~~~
“如果矩形区域有任何部分落在hrgn代表的区域内的话,该函数返回非零值”!
你想,“图形外框是否经过canvas上的某一矩形区域”是不是等同于“Canvas上的该矩形区域和图形区域是否相交”?

至于具体做法,如果你对这些API不熟悉的话,我给你个简单的例子,
比如在Image上画一个不规则五边形和一个圆,然后进行判断——

var
R, R2: TRect;
P: array[1..6] of TPoint;
H, H1, H2: HRGN;
begin
R := Rect(60, 80, 100, 120);//圆形的外框
H1 := CreateEllipticRgnIndirect(R);
P[1] := Point(0, 0);
P[2] := Point(20, 100);
P[3] := Point(120, 120);
P[4] := Point(20, 50);
P[5] := Point(70, 40);
P[6] := Point(0, 0);
H2 := CreatePolygonRgn(P, 6, WINDING);//五边形
R2 := Rect(115, 100, 125, 130);//测试删格
with Image1.Canvas do begin
Rectangle(R2);
Brush.Color := clBlue;
Polygon(P);
Brush.Color := clRed;
Ellipse(R.Left, R.Top, R.Right, R.Bottom);
end;
H := H1;//一定要先给H赋值!(参见API说明)
CombineRgn(H, H1, H2, RGN_OR);//合并,注意最后一个参数
if RectInRegion(H, R2) then ShowMessage('ok');//检验效果
end;
 
to 不再:
不好意思,是我糊涂了,收回下面这句话:)——
“你想,“图形外框是否经过canvas上的某一矩形区域”是不是等同于“Canvas上的该矩形区域和图形区域是否相交”?”
——我只是想到了栅格处于边缘的时候能判断出来,但是如果用RectInRegion的话则对于区域内部的栅格也会返回真。
所以应该把我的代码里最后一句用下面两句替换掉:
H1 := CreateRectRgnIndirect(R2);
if CombineRgn(H, H, H1, RGN_AND) = COMPLEXREGION then ShowMessage('ok');
试一下看行不行。
 
多人接受答案了。
 
后退
顶部