Microstation VBA – Eşyükselti eğrisinin yumuşatılması

Yazan: Revne | Tarih 26 Şubat 2009 | Yorum  Yorum Yok
BerbatKötüOrtaGüzelHarika Henüz puan verilmemiş
Loading ... Loading ...

Daha once sozunu ettiğim CAD programı için Makro yazma işine ait başka bir kod.
Cografyadan da hatırlasınız Eşyukselti egerileri gectikleri noktalardaki yuksekligi ifade ederler. 1200m cizgisinin geçtiği her yer 1200m yuksekligindedir. Boyle cizgiler 2D olan haritalar uzerine işlenerek 3D bilgi içermesi sağlanıyor. Haritaya bakan biri nerenin yuksek,nerenin alçak olduğunu kolayca anlıyor.

Bu eğriler soyle meydana getirilir. Ilk olarak arazi ekibi bolgede harita aletleriyle (GPS) yuksekligin değiştiği yerlerde rastgele rastgele ölçümler yaparlar. Bu olculen noktalar kullanılarak Ucgenleme yapılır. Bu üçgenlerin yüzeyleri toplamı bizim arazinin şeklini verecektir. Daha sonra bu üçgenler yardımıyla bu yüzeyden aynı yukseklikteki yerlerden doğrular geçirilir. Bu dogrular çoğunlukla birbirini takip eden çizgiler olurlar (Coklu cizgiler). Bu cizgi gecislerini yuvarlamak gerekiyor. Kısaca cizgi gecişleri yumuşak olacak.

Bu işlem icin herkesin kullandığı yöntem Spline oluşturma. Bu yontem hem ciddi hesaplamalar hem de bazı özel durumlarda gerçek dışı sonuc ürettiğinden kendi algoritmamızı üretmek zorunda kaldık..
Algoritma:

Visual Basic:
  1. 'Gursel Guzel && Enver Gül Yontemi
  2. Public Function EgriYumusat_GE(ele As Element, yumpar As Double, retCnt As Integer) As Point3d()
  3.    
  4.   Dim i As Integer, j As Integer, sayi As Integer, sayi2 As Integer, kontrol As Integer
  5.   Dim xy0 As Point3d, xy1 As Point3d, xy2 As Point3d, xy3 As Point3d
  6.   Dim xy4 As Point3d, xy5 As Point3d, xy6 As Point3d
  7.   Dim dy As Double, dx As Double, dz As Double
  8.   Dim dy1 As Double, dx1 As Double, dz1 As Double
  9.   Dim dy2 As Double, dx2 As Double, dz2 As Double
  10.   Dim s1 As Double, s2 As Double, s As Double, l As Double
  11.   Dim r As Double, delta As Double, ac As Double, sm As Double, dk As Double, kot As Double
  12.   Dim nok(MAXARRSIZE) As Point3d, vlist() As Point3d, w(MAXARRSIZE) As Point3d
  13.  
  14.   sayi = ele.AsVertexList.VerticesCount
  15.   vlist = ele.AsVertexList.GetVertices()
  16.   For i = 0 To sayi - 1
  17.     nok(i + 1) = vlist(i)
  18.   Next
  19.  
  20.   If nok(1).x = nok(sayi).x And nok(1).y = nok(sayi).y Then
  21.     sayi = sayi + 1
  22.     nok(sayi).x = nok(2).x
  23.     nok(sayi).y = nok(2).y
  24.     nok(sayi).Z = nok(2).Z
  25.     kontrol = 1
  26.   Else
  27.     sayi2 = sayi2 + 1
  28.     w(sayi2).y = nok(1).y
  29.     w(sayi2).x = nok(1).x
  30.     w(sayi2).Z = nok(1).Z
  31.     kontrol = 0
  32.   End If
  33.  
  34.   For i = 1 To sayi - 2
  35.     dy1 = nok(i + 1).y - nok(i).y: dx1 = nok(i + 1).x - nok(i).x: dz1 = nok(i + 1).Z - nok(i).Z
  36.     If dy1 = 0 Then dy1 = 0.0001
  37.     If dx1 = 0 Then dx1 = 0.0001
  38.     If dz1 = 0 Then dz1 = 0.0001
  39.     s1 = Sqr(dy1 * dy1 + dx1 * dx1)
  40.    
  41.     dy2 = nok(i + 2).y - nok(i + 1).y: dx2 = nok(i + 2).x - nok(i + 1).x: dz2 = nok(i + 2).Z - nok(i + 1).Z
  42.     If dx2 = 0 Then dx2 = 0.0001
  43.     If dy2 = 0 Then dy2 = 0.0001
  44.     If dz2 = 0 Then dz2 = 0.0001
  45.     s2 = Sqr(dy2 * dy2 + dx2 * dx2)
  46.    
  47.     If (s1> yumpar And s2> yumpar) Then
  48.       l = yumpar / 2#
  49.     Else
  50.       If (s1> s2) Then l = s2 / 2# Else l = s1 / 2#
  51. '      If l  1#) Then dy = 1#
  52.     If (dy <-1#) Then dy = -1#
  53.     delta = Atan2(Sqr(1 - dy * dy), dy) 'delta = acos(dy) 'ACos(x) = Atan2(Sqr(1 - x * x), x)
  54.     dy = xy1.y - xy5.y
  55.     dx = xy1.x - xy5.x
  56.     If (dy = 0) Then dy = 0.001
  57.     If (dx = 0) Then dx = 0.001
  58.     ac = Atan2(dy, dx)
  59.     If (ac  2 * Pi) Then
  60.         sm = sm - 2# * Pi
  61.       Else
  62.         If (sm <0) Then sm = sm + 2# * Pi
  63.       End If
  64.       sayi2 = sayi2 + 1
  65.       w(sayi2).y = xy5.y + r * Sin(sm)
  66.       w(sayi2).x = xy5.x + r * Cos(sm)
  67.       w(sayi2).Z = xy0.Z + j * dz / 4
  68.     Next
  69.     sayi2 = sayi2 + 1
  70.     w(sayi2) = xy3
  71. NEXT_I:
  72.   Next
  73.   If (kontrol = 1) Then
  74.     sayi2 = sayi2 + 1
  75.     w(sayi2) = w(1)
  76.   Else
  77.     sayi2 = sayi2 + 1
  78.     w(sayi2) = nok(sayi)
  79.   End If
  80.   retCnt = sayi2
  81.   EgriYumusat_GE = w
  82. End Function

Burada kodları bulunan algoritma da, kullanıcıdan bir yumuşatma parametresi alıyoruz. Bir çizgiden diğer çizgiye geçişlerde, her iki çizgiden de bu parametre uzunluğu kadar kesinti yaparak yumuşatma için bir bolge uluşturuyoruz. Bu bolgeyi çizgilerin arasındaki açı dikkate alınarak standart 4 parçaya ayrıyoruz. Son bir işlem olarak kesilen eski çizgiler ile oluşan bu yeni parçalar uç uca ekleniyor. Boylece iki cizgi arasındaki geçişler biraz kesintiyle araya 4 ufak cizgi ekleyerek yumuşatılmış oldu.

Kolay gelsin...

Çok sevdim, başkalarıyla paylaşayım:
  • Google Bookmarks
  • Facebook
  • MySpace
  • TwitThis
  • del.icio.us
  • Digg
  • Live
  • YahooMyWeb
  • Technorati
  • StumbleUpon

Benzer Yazılar


Yorum Yap


(gerekli)

(gerekli,yayınlanmaz)




XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>