当前位置:编程学习 > VB >>

求救!一组点的某个点到令一组点的最小距离

现有两组点,第一组
X -7.695923 Y -30.162109 Z -1.325561
X 29.711304 Y -0.000976 Z -1.423828
X -29.942383 Y -0.001464 Z -1.736206
X 22.268799 Y -30.151367 Z -1.957153
X 14.734619 Y 29.976563 Z -2.360474
第二组类似,两组点的数量都很多,一万多。要求在第二组点中找到以第一组中各点的最小距离,以第一组第一个点X -7.695923 Y -30.162109 Z -1.325561为例,要找到第二组点中与X -7.695923 Y -30.162109 Z -1.325561距离最小的点,并显示出来。如
X -7.695923 Y -30.162109 Z -1.325561  最近点 X ?  Y?   Z?
请各位大侠帮忙啊,急!老板几天就要程序 --------------------编程问答-------------------- 其实您的要求是三维坐标系长度统计,通过三维分解,将三维坐标分解成两个直角三角型,一个是XY平面三角形,一个垂直于XY平面的YZ平面直角三角形。
计算公式通过勾股定理分别计算两个三角形的两点间长度并将其叠加后的和,该和就是两点间长度。
最后通过循环第一组与第二组的组合,来判断最短距离。
分析:
1、首先对第一组和第二组的随机两个点进行分析,设:第一组的坐标标记为:X1n Y1n Z1n;第二组的坐标标记为X2n Y2n Z2n。
2、用VB.net语言描述的勾股定理整合公式:Math.SQRT((X1n-X2n)^2+(Y1n-Y2n)^2)+Math.SQRT((Z1n-Z2n)^2+(Y1n-Y2n)^2),   其中SQRT是开方。

代码(VB.NET,按照思维去写,没有调试过,具体请自行调试):
for i as integer = 0 to Group1.length
    dim MinLength as double = 999999999 '缓存最小距离,预初始化一个最大值。
     dim MinLocation as integer '缓存距离组1指定坐标点最近的组2坐标编号。
    for ii as int = 0 to Group2.length
        dim thisLength as double = Math.SQRT((Group1(i).X1n-Group2(ii).X2n)^2+(Group1(i).Y1n-Group2(ii).Y2n)^2)+Math.SQRT((Group1(i).Z1n-Group2(ii).Z2n)^2+(Group1(i).Y1n-Group2(ii).Y2n)^2)
        if MinLength>thisLength then
            MinLength=thisLength
            MinLocation = Group2(ii)
        end if
    next
    print "组1第" & i & "号坐标到组2第 & MinLocation & "号坐标的距离最短,具体距离=" & MinLength & "。"
next --------------------编程问答-------------------- 楼主立体几何没学好 --------------------编程问答-------------------- 不好意思,公式这里我有个地方弄错了,
Math.SQRT((X1n-X2n)^2+(Y1n-Y2n)^2)+Math.SQRT((Z1n-Z2n)^2+(Y1n-Y2n)^2) 应该改成:
Math.SQRT(Math.SQRT((X1n-X2n)^2+(Y1n-Y2n)^2)^2 + (Z1n-Z2n)^2),
公式的原理是:以其中一个点作为原点,并以原点建立一个XY平面;再以两点间连线在XY平面的投影线作为X边(记作Xxy),以两点间的Z投影(记作高度)差作为Y边,以两点间的距离作为斜边构成一个直角三角形,该三角形垂直于XY平面。
公式中:Math.SQRT((X1n-X2n)^2+(Y1n-Y2n)^2)^2用于计算Xxy边长度,(Y1n-Y2n)计算Y边长度,得到Xxy边和Y边长度后,再进行一次勾股定理计算,得到斜边距离,斜边距离就是您所要求两点间距离。
公式经过变换简化后的形式:Math.SQRT((X1n-X2n)^2+(Y1n-Y2n)^2+(Z1n-Z2n)^2)

将公式套进代码:
for i as integer = 0 to Group1.length
  dim MinLength as double = 999999999 '缓存最小距离,预初始化一个最大值。
  dim MinLocation as integer '缓存距离组1指定坐标点最近的组2坐标编号。
  for ii as int = 0 to Group2.length
  dim thisLength as double = Math.SQRT((X1n-X2n)^2+(Y1n-Y2n)^2+(Z1n-Z2n)^2)
  if MinLength>thisLength then
  MinLength=thisLength
  MinLocation = Group2(ii)
  end if
  next
  print "组1第" & i & "号坐标到组2第 & MinLocation & "号坐标的距离最短,具体距离=" & MinLength & "。"
next --------------------编程问答-------------------- 谢谢这位大侠,我VB实在太菜了,刚学! --------------------编程问答-------------------- 问题补充,读入TXT方法及输出结果到TXT,请各位多多指教啊 --------------------编程问答-------------------- open语句,readfile/writefile等api操作。封装的还有fso等。 --------------------编程问答-------------------- 另,速度方面我估计问题很大哦 --------------------编程问答-------------------- 请各位大侠讲仔细一点,最好有代码,我实在不会编啊,55! --------------------编程问答-------------------- 文本文件操作代码百度一下我估计你看都看不过来。msdn里面也有实例 --------------------编程问答-------------------- TXT请参阅6楼,如果您觉得Open难用,就用fso好了,而且如果您是用VB.net会更方便。Open将会被逐渐淘汰了。但代码就不贴了,程是编出来的,不能都具体地抄。
6楼说到的速度问题,但您要考虑到一点,有些事情是必须要做的,不能免。例如逐点比较,不比较您就不知道哪两个点之间距离最短,因此为了正确的结果,有时候必须牺牲点速度。
当然,实现方法上还有很多手段可以提高,例如将集合A和集合B写到数据库上,通过查询命令提交给SQL完成,或者速度及代码简洁度会更好;但现在楼主只给出的条件就这些,所以就只能利用现有条件去解决了。 --------------------编程问答-------------------- 都是牛人 --------------------编程问答-------------------- 先读两个TXT文件的数据,在对这些数据进行计算,最后输出结果到txt --------------------编程问答-------------------- 有必要事先分析第一组点第二组点所构成的点阵的特征,关键是在比较时,改进冒泡法的效率,即机会堆栈。。 --------------------编程问答-------------------- 过去这么久了么。。
一个点m与一组点M的距离可以这么算
det([M,m]*[M,m]')/det(M*M')
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,