明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3761|回复: 14

[测绘]自动联结三角形网

  [复制链接]
发表于 2004-1-10 18:20:00 | 显示全部楼层 |阅读模式
自动联结三角形网是将平面上的离散点中最靠近的三点构成三角形,从而形成三角形网。在使用周围临近的离散点组成三角形时,应确保每个三角形都是锐角三角形或三边的长度近似相等,避免出现过大的钝角和过小的锐角。
确定第一个三角形
    首先要确定第一个三角形。设L为形成的三角形计数号,K为用来扩展的三角形的计数号,用V(L,1),V(L,2),V(L,3)分别表示为L号三角形的三个顶点编号。开始联结三角形时,设L=1,然后从N个离散点中找出左下角的点送入V(L,1)中,作为第一个三角形的第一个顶点,找出距离该点最近的点送入V(L,2)中,作为第一个三角形的第二个顶点,找出距离这两点连线中点最近而且不和这两点在一直线上的点送入V(L,3)中,作为第一个三角形的第三个顶点。
三角形的扩展
    利用计数器K、L来确保三角形中没有重复和交叉的三角形。在形成第一个三角形时,L=1,K=1,首先从K号三角形的第一边(V(L,1)、V(L,2))往外扩展,显然位于顶点V(L,3)同侧的点应排除,利用直线判断正负区的原理可以实现这一要求:
F(x,y)=y-Ax-B
A=(y2-y1)/(x2-x1)
B=(y1*x2-y2*x1)/(x2-x1)
很明显:
F(x,y)>0  观测点位于正区;
F(x,y)=0  观测点位于直线上;
F(x,y)<0  观测点位于负区;
将V(L,3)代入F(x,y),记下F(x,y)值的符号,然后将其余的离散点代入F(x,y),逐个比较值的符号,凡是同V(L,3)点的符号不同的点才具有被扩展使用的可能性。从这些点中挑选一点送入V(L,3)中(条件:三角形边角的余弦定理,如果该点与扩展边上的两点组成的角在所有形成的三角形中为最大,该点就作为三角形的第三个顶点送入V(L,3)中)。新的三角形基本形成,并使L=L+1。但为了避免重复和交叉,还要进行检查判断,方法是:利用三角形的任一边最多只能被二个三角形公用这一条件,进行全等比较。即要判断新组成的三角形的三条边是否已经被前面形成的三角形用过两次,如果是该三角形无效,则L=L-1,否则,该三角形成立。
    K号三角形的第一边扩展完后,就可转向其他二条边,继续重复上述扩展。当形成一个新的三角形时,必须使L=L+1。直到K号三角形的三边都扩展完。再转向K=K+1号三角形做扩展。
如何判断扩展终止
可以用两个条件检查:(1)、K=L,(2)、K号三角形的三条边都做完扩展工作。因为开始生成的三角形数L总是要大于要扩展的三角形数K,只有K=L时,表示不可能再有新的三角形生成,扩展工作结束。三角网就形成了。
发表于 2004-1-12 09:52:00 | 显示全部楼层
多谢楼主的热心帮助!!!
发表于 2004-1-12 22:04:00 | 显示全部楼层
好帖!
发表于 2004-1-14 12:47:00 | 显示全部楼层
第一个三角形的v(l,1)是不是一定要左下角呢?左下角是不是指x+y最小的点呢?

我总是进行到一部分就停了,还有一个问题,v()数组中定义V的上限是多少呢?也就是说n个点最多能组合多少个三角形呢?
 楼主| 发表于 2004-1-14 13:08:00 | 显示全部楼层
topirol发表于2004-1-14 12:47:00第一个三角形的v(l,1)是不是一定要左下角呢?左下角是不是指x+y最小的点呢?

我总是进行到一部分就停了,还有一个问题,v()数组中定义V的上限是多少呢?也就是说n个点最多能组合多少个



1、可以是左下角点,也可以是右上角点。
2、n个点最多能组合2*n-5个三角形。
发表于 2004-1-14 16:07:00 | 显示全部楼层
看看我的程序,找不出问题出在哪里
发表于 2004-1-14 16:16:00 | 显示全部楼层
我怀疑是这里出问题:
  1. '确定第一个三角形
  2.     '确定第一个顶点(最左)

  3.     Dim sum_x_y As Double
  4.    
  5.     sum_x_y = X(1) + Y(1)
  6.     v(1, 1) = 1
  7.     For i = 2 To arrary_nub
  8.     If (X(i) + Y(i)) < sum_x_y Then
  9.     sum_x_y = X(i) + Y(i)
  10.     v(1, 1) = i
  11.     End If
  12.     Next i

  13.    
  14.     '确定第二隔顶点(距离第一个顶点最近的点)
  15.    
  16.     v(1, 2) = search_min_dis(v(1, 1))'找出最近点
  17.    
  18.     '确定第三隔顶点(这两顶点连线中点最近而且不和这两点在一直线上的点)
  19.     Dim tx As Double
  20.     Dim Ty As Double
  21.     Dim Tz As Double
  22.     tx = (X(v(1, 1)) + X(v(1, 2))) / 2
  23.     Ty = (Y(v(1, 1)) + Y(v(1, 2))) / 2
  24.     Tz = (Z(v(1, 1)) + Z(v(1, 2))) / 2
  25.     v(1, 3) = search_min_dis1(tx, Ty, Tz, v(1, 1), v(1, 2))’找出最近点,而且不在同一直线上
  26.    
  27. '三角形的扩展
  28.     K = 1
  29.     L = 1
  30.     Dim index_v3 As Integer '记录扩展三角形的第三个顶点
  31.     Do
  32.       '扩展第1边n1-n2
  33.      ProgressBar1.Value = ProgressBar1.Value + 1
  34.       index_v3 = Search_Arc_Max(v(K, 1), v(K, 2), v(K, 3))
  35.       
  36.       If index_v3 <> 0 Then
  37.       L = L + 1
  38.       v(L, 1) = v(K, 1)
  39.       v(L, 2) = v(K, 2)
  40.       v(L, 3) = index_v3
  41.       
  42.       If Is_twice_used(L) Then’'判断该三角形3边是否被前面三角形用过2次
  43.          L = L - 1
  44.       End If
  45.       End If
  46.           '扩展第2边n2-n3

  47.       index_v3 = Search_Arc_Max(v(K, 2), v(K, 3), v(K, 1))‘'找出与v(K, 2), v(K, 3)夹角 最大的点(跟v(K, 1)在不同区)
  48.      
  49.       If index_v3 <> 0 Then
  50.       L = L + 1
  51.       v(L, 1) = v(K, 2)
  52.       v(L, 2) = v(K, 3)
  53.       v(L, 3) = index_v3
  54.       If Is_twice_used(L) Then
  55.         L = L - 1
  56.       End If
  57.       End If
  58.               '扩展第3边n1-n3

  59.       index_v3 = Search_Arc_Max(v(K, 1), v(K, 3), v(K, 2))
  60.      
  61.       If index_v3 <> 0 Then
  62.       L = L + 1
  63.       v(L, 1) = v(K, 1)
  64.       v(L, 2) = v(K, 3)
  65.       v(L, 3) = index_v3
  66.       If Is_twice_used(L) Then
  67.         L = L - 1
  68.       End If
  69.       End If
  70.       
  71.       
  72.       K = K + 1

  73.     Loop Until K = L
发表于 2004-1-14 19:41:00 | 显示全部楼层
好帖,楼主的帖总是让我获益匪浅,呵呵!送花一朵!
发表于 2004-1-15 22:00:00 | 显示全部楼层
做好了,不过不知道是不是VB效率低的原因,好像比较慢
 楼主| 发表于 2004-1-15 22:12:00 | 显示全部楼层
速度真快!
提个建议:加入角度或距离判断,这样周边的三角形就可以不连!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-28 07:24 , Processed in 0.197259 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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