Σάββατο, 4 Οκτωβρίου 2014

Πρόγραμμα ταχυμετρίας

Ταχυμετρία είναι η διαδικασία οριζοντιογραφικής και υψομετρικής αποτύπωσης σημείων λεπτομερειών του εδάφους. Από αυτή την διαδικασία συλλέγονται δεδομένα από τα οποία, μετά από υπολογισμούς, θα προκύψουν οι συντεταγμένες των σημείων λεπτομερειών του εδάφους. Θα μελετήσουμε την δημιουργία ενός προγράμματος επεξεργασίας αυτών των δεδομένων.
Τα δεδομένα μας είναι οι συντεταγμένες του σημείου προσανατολισμού (x1, y1), οι συντεταγμένες και το υψόμετρο του σημείου στάσης (x2, y2, h2) και η γωνία θλάσης (b), η κεκλιμένη απόσταση (s) και η ζενίθια γωνία (v) για κάθε σημείο λεπτομέρειας. Ζητούμενα είναι η συντεταγμένες (x, y) και το υψόμετρο (h) για κάθε σημείο λεπτομέρειας. Έτσι χρησιμοποιώντας τα θεμελιώδη προβλήματα της τοπογραφίας και στοιχειώδη μαθηματικά θα καταφέρουμε να επεξεργαστούμε τα δεδομένα για να καταλήξουμε στα ζητούμενα.

Ο κώδικας που κάνει την παρακάτω διαδικασία (σε visual basic) είναι ο εξής:

Private Sub Command1_Click()

Dim pi As Double
Dim x1 As Double, y1 As Double
Dim x2 As Double, y2 As Double, h2 As Double
Dim b As Double, v As Double, s As Double

pi = 4 * Atn(1)

Open "meas.txt" For Input As #1
Open "reasults.txt" For Output As #2

Input #1, id1, x1, y1
Input #1, id2, x2, y2, h2, jt

Call secondf(x1, y1, x2, y2, g)

Do While Not EOF(1)
Input #1, id, b, v, s, jr
hd = s * Sin(v * pi / 200)
vd = s * Cos(v * pi / 200)
x = x2 + hd * Sin((b + g + 200) * pi / 200)
y = y2 + hd * Cos((b + g + 200) * pi / 200)
h = h2 + vd + jt - jr
Print #2, id, Format(x, "0.000"), Format(y, "0.000"), Format(h, "0.000")
Loop

Close

End Sub

Private Sub secondf(x1, y1, x2, y2, g)
Dim pi As Double
pi = 4 * Atn(1)

dx = x2 - x1
dy = y2 - y1

If dx > 0 And dy = 0 Then
g = 100
ElseIf dx < 0 And dy = 0 Then
g = 300
ElseIf dx = 0 And dx > 0 Then
g = 0
ElseIf dx = 0 And dy < 0 Then
g = 200
ElseIf dx <> 0 And dy <> 0 Then
a = (Atn(Abs(dx / dy))) * (200 / pi)
If dx > 0 And dy > 0 Then
g = a
ElseIf dx > 0 And dy < 0 Then
g = 200 - a
ElseIf dx < 0 And dy < 0 Then
g = 200 + a
ElseIf dx < 0 And dy > 0 Then
g = 400 - a
End If
End If

End Sub

Ο παραπάνω κώδικας λειτουργεί ως εξής: Αρχικά στο τμήμα

Dim pi As Double
Dim x1 As Double, y1 As Double
Dim x2 As Double, y2 As Double, h2 As Double
Dim b As Double, v As Double, s As Double

δηλώνουμε τις μεταβλητές που θα χρησιμοποιήσουμε. Οι μεταβλητές αυτές είναι τα δεδομένα μας και ο αριθμός π (pi). Ο λόγος που δηλώνουμε το π είναι πως δεν υπάρχει ως σταθερά μέσα στην visual basic και πρέπει να την δημιουργήσουμε εμείς. Την δημιουργούμε με την εντολή

pi = 4 * Atn(1)

καθώς atan(1)=π/4.

Έπειτα, δηλώνουμε δύο αρχεία μορφής txt. Από το ένα αρχείο το πρόγραμμα θα αντλεί δεδομένα ενώ στο άλλο θα τυπώσει τα αποτελέσματα. Η εντολή για να γίνει το παραπάνω είναι η εξής:

Open "meas.txt" For Input As #1
Open "reasults.txt" For Output As #2

Ο κώδικας ονομάζει το αρχείο meas.txt ως 1 και το αρχείο reasults.txt ως 2.

Μετά ξεκινάει η διαδικασία της άντλησης δεδομένων από το αρχείο 1. Με την εντολή

Input #1, id1, x1, y1
Input #1, id2, x2, y2, h2, jt

διαβάζονται από τον κώδικα οι δύο πρώτες σειρές του αρχείου 1 και η μεταβλητές που αναφέρονται στον κώδικα λαμβάνουν τις τιμές που αναφέρονται στο αρχείο 1.

Χρησιμοποιώντας τις τιμές αυτές με το δεύτερο θεμελιώδες υπολογίζεται το αζιμούθιο μεταξύ του σημείου στάσης και το σημείο προσανατολισμού. Για να γίνει αυτό χρησιμοποιούμε ένα υποπρόγραμμα που το ονομάσαμε secondf και το οποίο το καλούμε στον κύριο κώδικα με την εντολή

Call secondf(x1, y1, x2, y2, g)

Αυτό παίρνει τις τιμές των x1, x2, y1, y2 και αποδίδει την τιμή του g. Ο κώδικας που απαρτίζει το υποπρόγραμμα είναι ο εξής:

Private Sub secondf(x1, y1, x2, y2, g)
Dim pi As Double
pi = 4 * Atn(1)

dx = x2 - x1
dy = y2 - y1

If dx > 0 And dy = 0 Then
g = 100
ElseIf dx < 0 And dy = 0 Then
g = 300
ElseIf dx = 0 And dx > 0 Then
g = 0
ElseIf dx = 0 And dy < 0 Then
g = 200
ElseIf dx <> 0 And dy <> 0 Then
a = (Atn(Abs(dx / dy))) * (200 / pi)
If dx > 0 And dy > 0 Then
g = a
ElseIf dx > 0 And dy < 0 Then
g = 200 - a
ElseIf dx < 0 And dy < 0 Then
g = 200 + a
ElseIf dx < 0 And dy > 0 Then
g = 400 - a
End If
End If

End Sub

Αυτό που γίνεται είναι η διερεύνηση των προσήμων του dx και dy και ανάλογα την περίπτωση δίνει την κατάλληλη τιμή στο g.

Επιστρέφοντας στο κεντρικό πρόγραμμα, ο κώδικας διαβάζει την επόμενη γραμμή από το αρχείο 1. Έπειτα κάνει τους κατάλληλους υπολογισμούς, και τυπώνει στο αρχείο 2 τα αποτελέσματα. Η διαδικασία αυτή επαναλαμβάνεται μέχρι να τελειώσουν οι γραμμές του αρχείου 1. Τα παραπάνω γίνονται με την παρακάτω εντολή

Do While Not EOF(1)
Input #1, id, b, v, s, jr
hd = s * Sin(v * pi / 200)
vd = s * Cos(v * pi / 200)
x = x2 + hd * Sin((b + g + 200) * pi / 200)
y = y2 + hd * Cos((b + g + 200) * pi / 200)
h = h2 + vd + jt - jr
Print #2, id, Format(x, "0.000"), Format(y, "0.000"), Format(h, "0.000")


Loop

Τέλος, ο κώδικας κλείνει όλα τα αρχεία με την εντολή

Close

Μπορούμε να δούμε ένα αρχείο εισαγωγής και το αντίστοιχο αρχείο εξαγωγής.

Το αρχείο εισαγωγής είναι το

S1,0,0
S2,100,200,50,1.60
1,134.699,95.7788,149.174,1.44
2,133.8948,95.7942,124.848,1.44
3,132.8994,95.8824,98.531,1.5
4,134.056,95.7684,62.831,1.44
5,131.7536,95.8268,31.545,1.44

και το αρχείο εξαγωγής είναι το

 1            20.671        325.945       60.044
 2            32.280        304.561       58.402
 3            45.266        281.682       56.469
 4            66.053        252.706       54.333
 5            82.010        225.830       52.226

Έτσι, με την επεξεργασία των μετρήσεων του αρχείου 1 παίρνουμε τις τελικές συντεταγμένες στο αρχείο 2.

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου