求裁减矩形算法 ( 积分: 100 )

  • 主题发起人 主题发起人 SonicX
  • 开始时间 开始时间
S

SonicX

Unregistered / Unconfirmed
GUEST, unregistred user!
脑子卡壳做不出来了,设计一个这样的函数
lpDestRect目标区域
lpSrcRect来源区域
lpDestPoint复制的起点坐标
如果复制的区域完全在目标区域外则跳过
如果复制区域部分在目标区内则将复制区域剪切成适合的大小再复制到目标区域

举个例子
假设目标区域的位置是Rect(10,10,810,610)
现在将来源区域中Rect(50,50,100,100)复制到目标区域起点的Point(800,600)(不进行缩放)
这样只有10*10个像素是需要显示的,也就是将来源区域转换成Rect(50,50,60,60)

如果目标区域起点为Point(-10,-10),则Point(0,0),来源为Rect(60,60,100,100)
 
我用 Bitblt ,没有达到预期的效果。
 
1、这个问题很简单,不过给您提个建议:
其实目标区域起点为 Point(-10,-10) 也无妨,为什么要变成 Point(0,0) 呢?那样来源变成 Rect(70,70,100,100) 不就行了?图形学中负坐标的是大量存在的,您这么做真的是让人无法理解。
2、如果按照您的要求,我写的程序如下:
//正规化矩形,如果您的矩形都很正规,这步可以省略
procedure NormalizeRect(var lprcDst: TRect);
var
i: Longint;
begin
if lprcDst.Left > lprcDst.Right then
begin
i := lprcDst.Left;
lprcDst.Left := lprcDst.Right;
lprcDst.Right := i;
end;
if lprcDst.Top > lprcDst.Bottom then
begin
i := lprcDst.Top;
lprcDst.Top := lprcDst.Bottom;
lprcDst.Bottom := i;
end;
end;

function GetIntersectRect(lpDestRect, lpSrcRect: TRect; lpDestPoint: TPoint): TRect;
begin
NormalizeRect(lpDestRect);
NormalizeRect(lpSrcRect);
if lpDestPoint.X < 0 then
lpDestPoint.X := 0;
if lpDestPoint.Y < 0 then
lpDestPoint.Y := 0;
OffsetRect(lpDestRect, lpSrcRect.Left - lpDestPoint.X, lpSrcRect.Top - lpDestPoint.Y);
IntersectRect(Result, lpSrcRect, lpDestRect);
end;
 
解决了
DXDraw的bitfast必须传入DWORD类型值,如果是负的就成了$ffffffff - x了,所以必须定义为0
 
请教个问题:

用LineDDA在Image上画框。
将Image直接放在Form上没有问题可以画出。
但将Image放在Scrollbox上就不行了,看不到所画的框。
是不是句柄的原因? 该怎样处理? 谢谢!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3693132
 
灌水,呵呵..
 
楼主整个就一傻帽,脑子卡壳是正常现象,如果不卡壳反而不正常了...
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
926
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部