vc MFC中,知道一个起点,一条直线方程y=kx+b,怎么在界面上画出这条直线?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc MFC中,知道一个起点,一条直线方程y=kx+b,怎么在界面上画出这条直线?相关的知识,希望对你有一定的参考价值。

画直线,用Line函数就可以了。

并且,既然已经知道直线方程了,就不用知道起点。随便找两个x的值代入,得到y值,然后用Line(x1,y1,x2,y2)就画出来了。
参考技术A 。。
dc.setpixel 打点就可了追问

我不是很懂,能不能写一段代码具体说明一下,谢谢。

霍夫变换

一 霍夫直线变换

1 点斜式

直线方程可表示为:y = kx + b, 当k, b确定时,在xy平面上确定一条唯一直线;考虑同样的变形 b = -xk + y,当x, y确定时,可以看做在kb平面上确定的一条唯一直线;若x, y表示xy平面上一个已知坐标点,则经过该坐标点(x, y)可形成多条直线, 其表达式为:b = -xk + y。

考虑在平面图像上存在一条有效直线段,遍历图像上每一个点,并计算出每个点可能形成的直线参数;发现某个特定参数(k, b)出现次数最多,这个特定参数应该为图像上有效直线段的参数(k, b)。

通过以上观察,可以将参数(k, b)离散化,然后遍历平面图像上的每一个点,累加可能形成直线(k, b)参数;当遍历完整个图像后,在累加器(k, b)中会产生一个全局最大值,该值为平面图像上有效直线的参数(k, b)。

当平面图像上存在多条有效直线段时,在累加器(k, b)中会产生多个局部极大值,可以通过设定合理的阈值以检测出平面图像上的多条直线段。

2 极坐标

使用点斜式检测直线存在两个问题:

 1)y = kx + b 无法表达平行于y轴的直线段(k为无穷大);

 2)k, b取值都趋近于无穷大,离散化(k, b)后参数空间趋近无穷大,计算机存储空间有限;

 通过坐标转换,将直角坐标转换为极坐标可以解决以上问题。

技术分享图片

 根据图形可得:ab = 0 (向量a与向量b正交)

=>技术分享图片, 其中(x, y)为直线L上的任意点;

=>技术分享图片, 其中(x, y)为直线L上的任意点;

考虑在平面图像上存在一条有效直线段,离散化参数技术分享图片,然后遍历平面图像上每一个点,累加可能形成的直线技术分享图片参数;类似的,在技术分享图片平面上会产生一个全局最大值,该值即为平面图像上的有效直线参数技术分享图片;同理,针对平面图像上存在多条有效直线段情况,可以通过局部极大值检测多条有效直线段。

 

二 霍夫圆变换

 圆的方程式可表达为:技术分享图片,参数技术分享图片确定一个圆;

 离散化参数技术分享图片,遍历平面图像上每一个点,累加可能形成的圆技术分享图片参数, 在技术分享图片参数空间中寻找全局最大值或局部极大值以检测有效圆;

 圆的方程也可表达为:技术分享图片技术分享图片,参数技术分享图片确定一个圆;

 固定技术分享图片,遍历平面图像上每一个点,根据公式技术分享图片技术分享图片累加  技术分享图片参数空间,在参数空间技术分享图片寻找全局最大值或局部极大值以检测半径为技术分享图片的有效圆;

 多次遍历平面图像,并选择不同的半径技术分享图片可以检测平面图像上任意半径的圆。

 

 三 霍夫变换检测椭圆

平面上任意一个椭圆均可以看做单位圆经过缩放,旋转,平移操作形成,设在单位圆上的坐标点技术分享图片,经过缩放,旋转,平移变换的表达式为:

技术分享图片

=>技术分享图片, 技术分享图片

表达式构成参数空间技术分享图片,离散化该参数空间, 遍历平面图像上每一个点,累加可能形成椭圆的参数,在技术分享图片参数空间中寻找全局最大值或局部极大值检测椭圆。

以上方法形成的参数空间过大,实现时需要大量的存储空间,需要使用参数空间压缩的方法以便于计算机实现。

 

以上是关于vc MFC中,知道一个起点,一条直线方程y=kx+b,怎么在界面上画出这条直线?的主要内容,如果未能解决你的问题,请参考以下文章

Hough变换

霍夫变换

请问谁知道概率霍夫变换的原理是啥吗?

C# 二元一次方程参数求解

python语言编程

OpenGL:基本算法