如何计算圈选图块的面积(100分)

  • 主题发起人 主题发起人 watertown
  • 开始时间 开始时间
W

watertown

Unregistered / Unconfirmed
GUEST, unregistred user!
在Timage上面有一个图像,用鼠标圈选一块图。然后计算此图块面积,请问如何实现。
是通过image上的点的像素变化来纪录边界线呢?
还是另外存储边界线的坐标值?上面两种方法只是我的设想,具体实现还是请大家帮忙。谢谢
 
应该存储边界线的坐标值
 
求什么面积?
包含的象素个数? 还是数学意义上的面积?
如果是象素个数, 只要依次扫描每条scanline就可以得到了
 
是怎么个圈法呢?
如果是有一定形状的,如矩形,椭圆,那么实现起来很简单
,只要记住必要参数(长,宽,焦距,半径等)套公式

如果是任意的,还是记下所有鼠标经过的坐标吧,
在TImage的OnMouseMove事件里,把x,y参数记下,圈完了以后用线扫描的
方式计算面积。

代码大致如下:
S:=0;
for x=MinX to MaxX do
for y=MinY to Max Y do
if 存在(x,y)这个点 then Inc(S);

MinX,MaxX是以纪录坐标中X的最小和最大值,相应的MinY和MaxY也同理。
S是面积。

至于如何判断是否存在(x,y)这一点则应有不少方法,看你当初以什么方式
纪录
坐标了。
临时想的算法,可能比较笨,希望高手们还有好主意。
 
如果是规则图形则不用说,长*宽即可,由Mouse的位置决定.
如果不规则,则初上述大侠的方案外还可用下面方法,此方法
对极大图提速有效,但对小图则没有很大起色.
用边缘跟踪法获得总图边缘,成集合P[]
任取P中一点在图中与其它3个边缘点形成矩形矩形将原图
又分为4个不规则图,他们的边缘信息是P+矩形边缘,此时
计算出矩形面积,再递归上述算法直到四个点相邻或相同
即得所求
 
如果图形比较小,那么flood算法就够了,关键是找到一个内点。
 
是一个任意的边界,现在我的问题是如何纪录边界线,因为边界不规则,不知道用image像素的变化可不可行?另外,如果行扫描的话,存在很多种情况,不象多边形填充那样对每条边取上不取下即可。看到大家的帮助,我有下面一个想法,不知道可行不可行。
1。记录边界线的坐标
2。行扫描找到有两个边界点的线,找到两个边界点中间的点。这个点就是内点
3。面积=0,用flood算法,找到这个点周围的八个点,如果这八个点不是中间点,则面积+1,然后对这八个点重复上面算法。
至于crane的算法,我没有试过,但是上图形学课时学过。具体算法我会试一下的,谢谢大家。
 
sorry, 上面的第四行的'中间'两个字,应该是'边界'
 
agree flood算法
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
824
DelphiTeacher的专栏
D
后退
顶部