易码技术论坛

 找回密码
 加入易码
搜索
查看: 171974|回复: 7

[求助]如何获得屏幕上某条直线相对于水平线的坡度?

[复制链接]
发表于 2005-2-16 09:11:00 | 显示全部楼层
一个点根本无法确定一条直线阿??!!!
发表于 2005-2-16 09:39:00 | 显示全部楼层
楼上说的对!当然如果你是那样的一个图~你可以用读点再读第二个点嘛~不然似乎不可能啊
发表于 2005-2-16 10:14:00 | 显示全部楼层
如果你在做“大炮对射”之类的游戏,
建议你在画图的时候就记下坐标
 楼主| 发表于 2005-2-16 19:03:00 | 显示全部楼层
看上去似乎有些麻烦,不过看来好像也只有在绘制的时候记录拐点坐标了
发表于 2005-2-17 16:23:00 | 显示全部楼层
[转贴]霍夫变换
霍夫变换(Hough Transform)
              霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改
              进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。
              我们先看这样一个问题:设已知一黑白图像上画了一条直线,要求出这条直线所在的位置
              。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点
              (x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在
              参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的
              一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设
              图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。可以求出,过A点的直线
              的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程
              2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。 同
              理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)
              。这个性质就为我们解决问题提供了方法:
              首先,我们初始化一块缓冲区,对应于参数平面,将其所有数据置为0.
              对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。
              最后,找到参数平面上最大点的位置,这个位置就是原图像上直线的参数。
              上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线,最后通过
              统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,
              依此类推。
              在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜
              率为无穷大)。所以实际应用中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面
              上的一个点就对应到参数p---theta平面上的一条曲线上。其它的还是一样。
              在看下面一个问题:我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还
              要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在
              参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的
              圆心。在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。
              把上面的问题改一下,假如我们不知道半径的值,而要找出图像上的圆来。这样,一个办
              法是把参数平面扩大称为三维空间。就是说,参数空间变为x--y--R三维,对应圆的圆心和半径。
              图像平面上的每一点就对应于参数空间中每个半径下的一个圆,这实际上是一个圆锥。最后当然还
              是找参数空间中的峰值点。不过,这个方法显然需要大量的内存,运行速度也会是很大问题。
              有什么更好的方法么?我们前面假定的图像都是黑白图像(2值图像),实际上这些2值图像
              多是彩色或灰度图像通过边缘提取来的。我们前面提到过,图像边缘除了位置信息,还有方向信息
              也很重要,这里就用上了。根据圆的性质,圆的半径一定在垂直于圆的切线的直线上,也就是说,
              在圆上任意一点的法线上。这样,解决上面的问题,我们仍采用2维的参数空间,对于图像上的每
              一前景点,加上它的方向信息,都可以确定出一条直线,圆的圆心就在这条直线上。这样一来,问
              题就会简单了许多。
              接下来还有许多类似的问题,如检测出椭圆,正方形,长方形,圆弧等等。这些方法大都
              类似,关键就是需要熟悉这些几何形状的数学性质。霍夫变换的应用是很广泛的,比如我们要做一
              个支票识别的任务,假设支票上肯定有一个红颜色的方形印章,我们可以通过霍夫变换来对这个印
              章进行快速定位,在配合其它手段进行其它处理。霍夫变换由于不受图像旋转的影响,所以很容易
              的可以用来进行定位。
              霍夫变换有许多改进方法,一个比较重要的概念是广义霍夫变换,它是针对所有曲线的,
              用处也很大。就是针对直线的霍夫变换也有很多改进算法,比如前面的方法我们没有考虑图像上的
              这一直线上的点是否连续的问题,这些都要随着应用的不同而有优化的方法。
发表于 2005-2-17 16:28:00 | 显示全部楼层
解决楼主的问题就要使用类似的算法。
普通解决思路是,先用填充算法的变种处理有色区域(判断一个点是否为边界,如果是则不涂色,否则涂白色),这样就获得了一个图形的边界,然后通过霍夫算法获得直线的方程。这样就求出了所要的斜率。需要强调的是,使用这种算法,速度的快慢很关键,影响速度的因素有:一个好的获得边界的算法,一个优良的霍夫算法结构,一个好的编译器,一个快速的处理器……
发表于 2005-2-17 16:32:00 | 显示全部楼层
实际上,可以看出,楼主的图形是程序生成的而不是图像采集得来的,所以基本上不需要使用以上复杂的算法。解决思路是,在你通过连线的方法生成图形的时候,就记录每一条线段的方程,然后通过对点在某一定义域内是否符合某一方程来直接查表获得你所需要的直线的斜率,这种方法就要简单和实用的多。
 楼主| 发表于 2005-2-16 00:42:06 | 显示全部楼层 |阅读模式



例如上图,任意的斜坡,在某一段斜坡上有一个点,仅知道这个点的坐标,如何知道他所在斜坡的破度tan(a)?
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-8-24 02:14 , Processed in 0.016852 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表