算法题,大家帮忙想想



------
求解任一点A(X,Y)到一个不规则的对象上的最短距离。
这个对象是一个封闭对象,比如圆、多边形、椭圆等。

自己的方法:只想到以这点为圆心做一个圆,根据与对象的状态来判断,相切,相交。

兄弟们,帮忙想想吧
------
那个封闭对象应该可以用个方程式来表示吧,这样最终应该可以转化为求极限一类的操作

具体怎么做我也不知道,只是提供个思路
------
封闭对象上的线段和节点可以得到
------
你的方法等于没方法 只是把问题换了种方式来表达
首先要知道封闭对象的类型,如果你说这个不确定,那你的程序还不完整,获取图形对象的类型的接口还是要有的
有了类型这距离还不好算吗
------
引用 3 楼 gisgamer 的回复:

你的方法等于没方法 只是把问题换了种方式来表达
首先要知道封闭对象的类型,如果你说这个不确定,那你的程序还不完整,获取图形对象的类型的接口还是要有的
有了类型这距离还不好算吗

------
沉得好快,顶下
------
你可以看看geos开源库,里面就有现成算法函数。不过你需要先转换成他定义的对象。
------
我说说我的想法:
先在闭合对象上任意取一点B,连接已知点A和该任意点B,过B点做AB的垂线,与闭合对象可能有多个交点,要寻找的最短距离的点必然在垂线靠A点的那侧。所以可以将这些交点分为多个曲线段来处理,对每个曲线段,进行上述步骤,迭代趋近,得到A点到该曲线段距离最短的点。将所有曲线段上面找到的点相比,找出最短的点即为所求点。。
有点麻烦,呵呵
------
已知一个曲线方程和平面上一点,求点到曲线的最短距离。
这是高中数学上学的东西吧。

你这里就是想办法把曲线方程整出来就行了
------
引用 4 楼 zyrr159487 的回复:
引用 3 楼 gisgamer 的回复:

你的方法等于没方法 只是把问题换了种方式来表达
首先要知道封闭对象的类型,如果你说这个不确定,那你的程序还不完整,获取图形对象的类型的接口还是要有的
有了类型这距离还不好算吗

我的方法只能算个思路,还没想到如何实现。
封闭对象的类型是已知的,如上文所说是不规则图形,有可能是各种曲线合成了一个不规则图形。

------
引用 8 楼 mayudong1 的回复:

已知一个曲线方程和平面上一点,求点到曲线的最短距离。
这是高中数学上学的东西吧。

你这里就是想办法把曲线方程整出来就行了

------
引用 9 楼 liekkas 的回复:

引用 4 楼 zyrr159487 的回复:
引用 3 楼 gisgamer 的回复:

你的方法等于没方法 只是把问题换了种方式来表达
首先要知道封闭对象的类型,如果你说这个不确定,那你的程序还不完整,获取图形对象的类型的接口还是要有的
有了类型这距离还不好算吗

我的方法只能算个思路,还没想到如何实现。
封闭对象的类型是已知的,如上文所说是不规则图形,有可能是各种曲线合成了一……

------
那转化为一段一段的求可以不?
组成封闭对象的每一段线段至少应该是规则的吧,求点到这一段的最短距离,然后取最小的那个。
------
引用 12 楼 mayudong1 的回复:

那转化为一段一段的求可以不?
组成封闭对象的每一段线段至少应该是规则的吧,求点到这一段的最短距离,然后取最小的那个。

------
引用 13 楼 zyrr159487 的回复:
引用 12 楼 mayudong1 的回复:

那转化为一段一段的求可以不?
组成封闭对象的每一段线段至少应该是规则的吧,求点到这一段的最短距离,然后取最小的那个。

这也是个办法。
大家看这样可以不,以这点A做圆,然后在对象中遍历线段,判断这个圆与线段的交点(0 - 2), 如果是两个点,则取其中点B,将点A和点B连为直线,判断这条直线与对象的交点。

------
引用 13 楼 zyrr159487 的回复:
引用 12 楼 mayudong1 的回复:

那转化为一段一段的求可以不?
组成封闭对象的每一段线段至少应该是规则的吧,求点到这一段的最短距离,然后取最小的那个。

这也是个办法。
大家看这样可以不,以这点A做圆,然后在对象中遍历线段,判断这个圆与线段的交点(0 - 2), 如果是两个点,则取其中点B,将点A和点B连为直线,判断这条直线与对象的交点。

------
是不是可以这样:
把你的不规则图形表示成一个序列
类似
A点、B点、AB线型
B点、C点、BC线型
C点、A点、CA线型
这样实际就是分别求每个段和给定点的距离
而且应该这样
去一个段
求值
顺时针取下一个段
求值
逆时针取下一个段
求值
通过对值得比较决定遍历的方向
理论上应该是按着值变小的方向寻找
当发现值变大时
上一个值即为所求

大概是这个意思
具体实施可能会有问题
仅供参考
------
如果需要一个精确解,这个问题应该不容易,和你的图形形状关系很大。

如果不需要精确解,那么可以使用一些进化算法,例如粒子群算法,来试试看。
------
从该点向多边形的各个边做垂线,看垂足是否在边上
如果在,记录垂线长度
不在,记录该点到该直线(线段)两端的长度,记录小的那个
最后比较这些长度 

---------------------
来自:http://www.cocoachina.com/bbs/read.php?tid-47748.html
呵呵。
------
如果是多边形,那么最近点不是顶点就是某条边与过那点的垂线的交点。
如果是曲线,如果知道方程,求导后牛顿法求解,如果不知道方程,就向倒数方向迭代么~
------
如果你不确定你的所谓不规封闭曲线方程的话,无法求到切线方程,只能用遍历所有点来取最小值了。
首先分三类:(其实不规则图形不好判断是否在内部)
一。点在曲线内部
二。点在曲线上
三。点在曲线外部
再用两点距离公式求最小值。

如果确定有曲线方程,可以求出切线方程,然后使用垂直相关的两直线斜率相乘积为-1去计算最近点方程,再求最值。
------
先确定对象的边缘各点,一个一个的计算距离,然后经过比较就可以确定最短距离了。
------
只能想到最笨的办法:遍历
------
如果组成多边形的所有曲线(直线就不用说了,就比较线段两个端点距离即可。)完全没有规则(比如某段曲线本身无法用线性函数表示),那除了遍历曲线每个点的距离还真不知道怎么优化算法了。
如果每段曲线可以用线性函数表示,根据线性函数算出这段曲线的重心,连接重心,求和重心线段垂直相交的切线交点即可。
------
进来看看,学习一下~
------
不好意思,修正一下24楼,不是线性函数,而是非分段函数(晕了不知怎么表示)
------
确定封闭对象的中心点,计算A点到这个中心点的的距离,之后再减去中心点到这条线和封闭对象相交的那个点的距离,这样应该可以算出吧
------
首先计算封闭图形的重心坐标(X1,Y1),然后用(X,Y)和(X1,Y1)拟合直线,计算交点。
不知可否。
------
A*算法试试
------
其实各种不确定下,我只想到了 遍历。。。 别的貌似。。
------
使用深度缓冲区(Z-Buffer)算法就行了。
------
每天回帖即可获得10分可用分
------
求解任一点A(X,Y)到一个不规则的对象上的最短距离。
这个对象是一个封闭对象,比如圆、多边形、椭圆等。

自己的方法:只想到以这点为圆心做一个圆,根据与对象的状态来判断,相切,相交。
 

------
固定点为(a,b)
y=f(x) (圆,椭圆,正多变形都规则函数,不需分段表示)
求(x-a)^2+(f(x)-b)^2最值,然后把公式转为代码。。。
------
这个题目,对于点到一个不规则对象最短对象我觉得都应该要定义一下
------
求解任一点A(X,Y)到一个不规则的对象上的最短距离(法向距离??)

------
进来学习的!
------
围观一下
------
哎,我只想到了遍历
------
根据 对象的几何特点 一个个算 , 本人见过
------
把这个A点辐射放大,与B点相切时暂停并返回数据
------
找里A最近的一个图形端点,然后求A与该图形端点所连接的线段的最短距离=结果.
这个方法还没有证明,但暂时没有想到不成立的例子.
这个应该只能用在多边形上,
如果是圆或者椭圆那样的无穷多个端点就....
------
在不规则图形边上随机取一些点,然后求最短的距离,就认为是最短距离,虽不中,亦不远矣
------
记得好像MTALAB中有多元函数求最优解的方法,可以参考一下
------
如果有方程式,大学数学方法,导数,偏导数之类的
如果是分段的函数的话,按上面的方法先求分段的,然后取最小值,就是大学数学的问题,看看数学吧,我也忘了怎么用了
------
求解任一点A(X,Y)到一个不规则的对象上的最短距离。
这个对象是一个封闭对象,比如圆、多边形、椭圆等。

自己的方法:只想到以这点为圆心做一个圆,根据与对象的状态来判断,相切,相交。

找到不规则的对象的中心点b,
连接此点b与任一点A(X,Y)即会与不规则的对象有个交点c,
求点c 与A(X,Y)的距离即可。
 
仅供参考
------
友情支持,
------
看高手。。。
------
如果图形是极不规则,没有什么曲线方程那些,我提出一个想法:

图形是封闭的,那么是由一堆线段构成,每个线段会有两个端点,我们只需要比较这个点A和这些端点之间的距离,找到与之最近的一个端点B,然后端点B是两个线段共用的一个端点,分别找到这两个线段的另外一个端点,C和D。

然后取出BC和BD两个线段的中点E和F,分别连接A,得到线段AE和AF,比较AE和AF,假如AE比AF短,再比较AE和AB谁短,取BE的重点G,如果AE短,那么我们在EG段继续取中点H,然后再比较AG和AE。。。。 

反正就是这么一直分下去,分到最后会出现一次中间那根线比两边的都短或者相等,比如第一次分的时候AB直接就比AE和AF短,那么就可以判定AB就是最短距离。
------
以上办法会适用所有图形,但是因为在面对圆的时候,这个办法处理的速度就是遍历的速度,虽然这个办法后面会微分很多次,但是我们处理不规则多边形的细微线段本来就很小了,微分应该不会有太大代价
------
一点点遍历吧,又不用花很多时间。
------
进来学习的!
------
这其实是一个很复杂的问题。
------
帮忙顶一下
------
关注下,看看。
------
很补错嘛,顶下
------
路过……
------
可以画个正方形,然后根据正方形和各个图形的关系来判断。。。

我原来做过点和直线、直线和直线、直线和曲线(这个曲线包括园、椭圆之类的)、曲线和曲线的关系。。。

正方形的相对园来说好判断,你可以去参考计算几何里面的位置判断知识点。
------
ding
------
用微积分啊
------
你是在屏幕上显示吗?????如果你这个是关于显示的算法的话,,你就可以用光线投影算法。。你这种情况很简单。。就是从眼睛发出一条光纤射到屏幕上,,然后以这条光线为参照。。在三维视图中计算离眼睛远近的点,用COS的角度判断。然后旋转你的不规则图形,与光线垂直。。。。再用勾股定理就OK了。。。。
------
可以考虑先求这个封闭区域的外接矩形,然后看这个点与矩形的位置关系

只是一个想法。

------
(1)对图形求导。
(2)设(x0,y0)在图形上,带入导函数就是图形的切线方程;
(3)写出切线的过(x0,y0)的垂线方程;
(4)带入已知点,即可就出垂线方程;
(5)利用斜率积为-1,即可就出(x0,y0)的值;
(6)求出(x0,y0)到已知点的距离就是最短距离。
------
从该点向多边形的各个边做垂线,看垂足是否在边上
如果在,记录垂线长度

------
我同意这个观点
1)对图形求导。
(2)设(x0,y0)在图形上,带入导函数就是图形的切线方程;
(3)写出切线的过(x0,y0)的垂线方程;
(4)带入已知点,即可就出垂线方程;
(5)利用斜率积为-1,即可就出(x0,y0)的值;
(6)求出(x0,y0)到已知点的距离就是最短距离。
------
不错,顶起!
------
学习一下……
------
引用 67 楼 mmosquito_4 的回复:
我同意这个观点
1)对图形求导。
(2)设(x0,y0)在图形上,带入导函数就是图形的切线方程;
(3)写出切线的过(x0,y0)的垂线方程;
(4)带入已知点,即可就出垂线方程;
(5)利用斜率积为-1,即可就出(x0,y0)的值;
(6)求出(x0,y0)到已知点的距离就是最短距离。

------
应该还是要找到曲线方程的,找出距离的函数,求导,求极值
------
看数学上有什么办法
------
不懂.....
------

------
从头到尾看下来,我发现,早在 #3 楼的朋友就已经把问题说清楚了……

如果说那只是思路,只有看到代码才算是算法的话,那楼主只要给出用来表达那个封闭多边形的数据结构,代码也就出来了。

封闭多边形的每段无非是直线段(直线方程+系数)、弧线段(椭圆方程+系数)、样条段(样条方程+系数)等等,有了这些参数,逐个计算它们到 A 点的最短距离,然后再从中取个最小的,不就完事儿了吗?

(这也只是思路,hehe)


--------
With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is
hard to be sure where they are going to land, and it could be dangerous sitting under them as they
fly overhead.
出自 RFC1925 - The Twelve Networking Truths
------
引用 7 楼 liekkas 的回复:

我说说我的想法:
先在闭合对象上任意取一点B,连接已知点A和该任意点B,过B点做AB的垂线,与闭合对象可能有多个交点,要寻找的最短距离的点必然在垂线靠A点的那侧。所以可以将这些交点分为多个曲线段来处理,对每个曲线段,进行上述步骤,迭代趋近,得到A点到该曲线段距离最短的点。将所有曲线段上面找到的点相比,找出最短的点即为所求点。。
有点麻烦,呵呵

------
进来学习一下~
------
用微积分。
具体做法是:利用微积分找到封闭图形上的切线,找到切点,求出A点到每个切点的距离。最后找到最短距离。
但关键还是这个微积分得用代码形式写出来,不知道math函数是否提供这个函数了没,如果有的话,那就用这个方法,否则只有自己写了
------
用Mathcad软件求解,只要你把方程输入进去,就可以得到计算结果和图形,很方便的,VC太难了,还要编程!而且你的图形也明确。
------
等着高手来看看、。。。。
------
我觉得用简化多变型的方法可以。
简单的就遍历查找不规则对象每个面到点的距离。
如果对象复杂就用简单对象包围复杂对象预先求出对象到简单对象各个面得距离。
然后求点到简单对象的距离最短的面。 
再求复杂对象里面离点最近的距离。 还可以分多层嵌套很复杂的对象。
------
占楼学习
------
haha.heihei
------
标记下
------
去sourceforge还有codeproject上看看有木有开源的库,这种东东要自己编绘死人的鄂
------
一段一段地求了
------
分段 + 遍历 + 微积分
------
可将任一点A(X,Y)和对象放在一个坐标系(或合适的系统)来考虑!仅供参考!
------
;'gfhdfgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
------
KDTree, 就是做这个的, codeproject有例子
------
既然是不规则图形你就应该知道右多少条边塞,计算点到线段的距离就可以了塞
------

 我是来拿分的!!!
------
图像不大的话,把边缘每个点离它的距离都算一遍,也不会很慢吧。。
------
凑热闹来了
------
不太懂算法,不过先看看,以后研究
------
你是想编程还是画图,编程的话就遍历每个点,比出最短的哪个。画图就用一个圆规,一根尺子很简单就量出来了。
------
这个你用MATLAB编程实现,就是将图像导入变成矩阵,通过扫描计算每一个点的距离。我做了一百张不规则的图,算出过每一张图的最大距离。我的MATLAB程序如下:
function [point,lr]=final(x)
left=[];
for i=1:512
for j=1:512
if (x(i,j)==0)
left=[left;i,j,x(i,j)];
break
end
end
end
right=[];
for i=1:512
for j=512:-1:1
if (x(i,j)==0)
right=[right;i,j,x(i,j)];
break
end
end
end
up=[];
if(left(1,2)~=right(1,2))
for i=left(1,2)+1:right(1,2)-1
up=[up;left(1,1),i,x(left(1,1),i)];
end
end
down=[];
a=size(left,1);
if(left(a,2)~=right(a,2))
for i=left(a,2)+1:right(a,2)-1
down=[down;left(a,1),i,x(left(a,1),i)];
end
end
border=[left;up;right;down];
a=size(left,1);
neibu=[];
for i=2:a-1
c=left(i,2)+1;
d=right(i,2)-1;
for j=c:d
neibu=[neibu;left(i,1),j,x(left(i,1),j)];
end
end
temp=size(neibu,1);
r=[];
for i=1:temp
temp1=size(border,1);
d=[];
for j=1:temp1
temp3=[((neibu(i,1)-border(j,1))^2+(neibu(i,2)-border(j,2))^2)^0.5,((neibu(i,1)-border(j,1))^2+(neibu(i,2)-border(j,2)+1)^2)^0.5];
d=[d,mean(temp3)];
end
r=[r;min(d)];
end
[lr,i]=max(r);
point=[neibu(i,1),neibu(i,2)];
最小
距离也一样。你也可以用C语言实现。祝你学习顺利!
------
多看看书了
------
进来看一下
------
学习学习
桂ICP备07017180号