Microstation VBA – Eşyükselti eğrisinin yumuşatılması
Daha once sozunu ettiğim Microstation 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:
-
'Gursel Guzel && Enver Gül Yontemi
-
Public Function EgriYumusat_GE(ele As Element, yumpar As Double, retCnt As Integer) As Point3d()
-
-
Dim i As Integer, j As Integer, sayi As Integer, sayi2 As Integer, kontrol As Integer
-
Dim xy0 As Point3d, xy1 As Point3d, xy2 As Point3d, xy3 As Point3d
-
Dim xy4 As Point3d, xy5 As Point3d, xy6 As Point3d
-
Dim dy As Double, dx As Double, dz As Double
-
Dim dy1 As Double, dx1 As Double, dz1 As Double
-
Dim dy2 As Double, dx2 As Double, dz2 As Double
-
Dim s1 As Double, s2 As Double, s As Double, l As Double
-
Dim r As Double, delta As Double, ac As Double, sm As Double, dk As Double, kot As Double
-
Dim nok(MAXARRSIZE) As Point3d, vlist() As Point3d, w(MAXARRSIZE) As Point3d
-
-
sayi = ele.AsVertexList.VerticesCount
-
vlist = ele.AsVertexList.GetVertices()
-
For i = 0 To sayi - 1
-
nok(i + 1) = vlist(i)
-
Next
-
-
If nok(1).x = nok(sayi).x And nok(1).y = nok(sayi).y Then
-
sayi = sayi + 1
-
nok(sayi).x = nok(2).x
-
nok(sayi).y = nok(2).y
-
nok(sayi).Z = nok(2).Z
-
kontrol = 1
-
Else
-
sayi2 = sayi2 + 1
-
w(sayi2).y = nok(1).y
-
w(sayi2).x = nok(1).x
-
w(sayi2).Z = nok(1).Z
-
kontrol = 0
-
End If
-
-
For i = 1 To sayi - 2
-
dy1 = nok(i + 1).y - nok(i).y: dx1 = nok(i + 1).x - nok(i).x: dz1 = nok(i + 1).Z - nok(i).Z
-
If dy1 = 0 Then dy1 = 0.0001
-
If dx1 = 0 Then dx1 = 0.0001
-
If dz1 = 0 Then dz1 = 0.0001
-
s1 = Sqr(dy1 * dy1 + dx1 * dx1)
-
-
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
-
If dx2 = 0 Then dx2 = 0.0001
-
If dy2 = 0 Then dy2 = 0.0001
-
If dz2 = 0 Then dz2 = 0.0001
-
s2 = Sqr(dy2 * dy2 + dx2 * dx2)
-
-
If (s1> yumpar And s2> yumpar) Then
-
l = yumpar / 2#
-
Else
-
If (s1> s2) Then l = s2 / 2# Else l = s1 / 2#
-
' If l 1#) Then dy = 1#
-
If (dy <-1#) Then dy = -1#
-
delta = Atan2(Sqr(1 - dy * dy), dy) 'delta = acos(dy) 'ACos(x) = Atan2(Sqr(1 - x * x), x)
-
dy = xy1.y - xy5.y
-
dx = xy1.x - xy5.x
-
If (dy = 0) Then dy = 0.001
-
If (dx = 0) Then dx = 0.001
-
ac = Atan2(dy, dx)
-
If (ac 2 * Pi) Then
-
sm = sm - 2# * Pi
-
Else
-
If (sm <0) Then sm = sm + 2# * Pi
-
End If
-
sayi2 = sayi2 + 1
-
w(sayi2).y = xy5.y + r * Sin(sm)
-
w(sayi2).x = xy5.x + r * Cos(sm)
-
w(sayi2).Z = xy0.Z + j * dz / 4
-
Next
-
sayi2 = sayi2 + 1
-
w(sayi2) = xy3
-
NEXT_I:
-
Next
-
If (kontrol = 1) Then
-
sayi2 = sayi2 + 1
-
w(sayi2) = w(1)
-
Else
-
sayi2 = sayi2 + 1
-
w(sayi2) = nok(sayi)
-
End If
-
retCnt = sayi2
-
EgriYumusat_GE = w
-
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...
Yazdır
| 887 Görüntülenme | Kategori: 3D & CAD & CAM, Diğer Diller, Programlama |
Geri İzleme
Etiketler: Microstation, Softening, eşyükselti, Eğri, Yumuşatma, Bentley, Bspline, counter, VBABenzer Yazılar
Yorum Yap
XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

26 Şubat 2009 |












Henüz yorum yapılmamış.