ΑΦΙΝΙΚΟΣ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ ΣΥΝΤΕΤΑΓΜΕΝΩΝ


Εικονίδιο myAfin

 ΑΦΙΝΙΚΟΣ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ

Ένας αφινικός μετασχηματισμός είναι ένας μετασχηματισμός που διατηρεί τη συγραμμικότητα και τους λόγους των αποστάσεων μεταξύ σημείων που βρίσκονται στην ίδια ευθεία. 

Με απλά λόγια, μετασχηματίζει ευθείες γραμμές σε ευθείες γραμμές και παραλλήλους σε παράλληλες, αλλά μπορεί να αλλάξει αποστάσεις και γωνίες.


Σε n-διάστατους χώρους εκφράζεται με τη μορφή:
y = A x + b όπου:

x είναι το διάνυσμα θέσης του αρχικού σημείου.
y είναι το διάνυσμα θέσης του μετασχηματισμένου σημείου.

A είναι ένας πίνακας γραμμικού μετασχηματισμού (n × n, σε 2D 2×2). Αυτός ο πίνακας ελέγχει τις περιστροφές, κλίσεις, διαστολές/συμπιέσεις και ανακλάσεις.

b είναι ένα διάνυσμα μετάφρασης (translation) (n × 1, σε 2D 2×1). Αυτό το διάνυσμα ελέγχει τη μετατόπιση του χώρου.

Εχει εφαρμογή σε πολλούς τομείς όπως η ρομποτική, η κίνηση των γραφικών στον προγραμματισμό αλλά και, στην Τοπογραφία που μας αφορά. Ειναι στην ουσία το γνωστο "rubbersheet" στα σχεδιαστικά προγράμματα που, μετασχηματίζει ενα σκαναρισμένο διάγραμμα (άρα σημεία ορισμενα σε ενα "αυθαίρετο" σύστημα συντεταγμένων) σε ένα νέο, έχοντας αποδώσει σε κάποια συγκεκριμένα σημεία τις γνωστές συντεταγμένες που εισάγουμε.

Σε εμάς δίνει λύση στο πρόβλημα μετασχηματισμού συντεταγμένων από ένα παλιό σύστημα (π.χ. Υπουργείο Γεωργίας, TM3 πράξης εφαρμογής κ.α.) στο ΕΓΣΑ 87 (με μεγάλη ακρίβεια για την έκταση των έργων που μας απασχολούν), αρκεί να αποτυπώσουμε με το GΝSS τουλάχιστον 4 σημεία για τα οποία είχε στοιχεία και το αρχικό σύστημα.

Αφινικός Μετασχηματισμός Συντεταγμένων

Το πρόγραμμα ελέγχει σε ποια σημεία έχουμε αποδώσει "γνωστά σημεία" (control points) και με αυτα δημιουργεί 2 πίνακες: τον src με τα αρχικά Χ-Υ και τον dst που περιέχει τις αντίστοιχες νέες συντεταγμένες για αυτα τα σημεια.

Στη συνέχεια φτιάχνει τους πίνακες:

A_x = np.column_stack([src[:, 0], src[:, 1], np.ones(len(src))]) 
b_x = dst[:, 0]

  • src[:, 0]: x-συντεταγμένες των αρχικών σημείων
  • src[:, 1]: y-συντεταγμένες των αρχικών σημείων
  • np.ones(len(src)): στήλη με 1 για τον σταθερό όρο (μετατόπιση)
  • A_x: ο πίνακας σχεδιασμού για x-συντεταγμένες
  • b_x: οι στόχοι για x-συντεταγμένες (από τα μετασχηματισμένα σημεία)
Αντίστοιχα και για τα Α_y, b_y

και, επιλύει με την μέθοδο των ελαχίστων τετραγώνων:

Για x-συντεταγμένες:
A_x · params_x ≈ b_x, η λύση ελαχιστοποιεί το σφάλμα: Σ(b_xᵢ - A_xᵢ·params_x)²

Για y-συντεταγμένες: 
A_y · params_y ≈ b_y η λύση ελαχιστοποιεί το σφάλμα: Σ(b_yᵢ - A_yᵢ·params_y)²

όπου: 
Ax,y = [[X₁, Y₁, 1], [X₂, Y₂, 1], ..., [Xₙ, Yₙ, 1]] 
params_x = (AᵀA)⁻¹AᵀX_known 
params_y = (AᵀA)⁻¹AᵀY_known

Η δομή των Παραμέτρων:
params_x = [a₁₁, a₁₂, tₓ]
  • a₁₁: πόσο επηρεάζει το αρχικό x το νέο x'
  • a₁₂: πόσο επηρεάζει το αρχικό y το νέο x'
  • tₓ: οριζόντια μετατόπιση
params_y = [a₂₁, a₂₂, tᵧ]
  • a₂₁: πόσο επηρεάζει το αρχικό x το νέο y'
  • a₂₂: πόσο επηρεάζει το αρχικό y το νέο y'
  • tᵧ:   κατακόρυφη μετατόπιση
και δημιουργεί τον τελικό πίνακα μετασχηματισμού:

transform_matrix = np.vstack([params_x, params_y])

[[a₁₁, a₁₂, tₓ], 
 [a₂₁, a₂₂, tᵧ]]

π.χ.
a₁₁ = 0.8     # κλιμάκωση/περιστροφή στον x-άξονα
a₁₂ = 0.2     # επιρροή του y στον x' 
a₂₁ = -0.1    # επιρροή του x στον y' 
a₂₂ = 1.1     # κλιμάκωση/περιστροφή στον y-άξονα

για κάθε αρχικό σημείο δημιουργείται ο πίνακας: homogeneous_point = [x, y, 1],

και τελικά το σημείο με τις νέες συντεταγμένες:
transformed_point = transform_matrix @ homogeneous_point

με:
x' = a₁₁·x + a₁₂·y + tₓ    # η νέα Χ
y' = a₂₁·x + a₂₂·y + tᵧ    # η νέα Υ

Το πρόγραμμα περιέχει αναλυτικές οδηγίες και αποθηκεύει:
  • CSV αρχείο με τα point name, X, Y των μετασχηματισμένων σημείων.
          (point name μονο αν το ειχε και το αρχείο με τα αρχικά δεδομένα).
  • PDF αρχείο με αναλυτικά στατιστικά και αξιολόγηση.
  • DXF αρχείο για απευθείας εισαγωγή στο GIS/CAD πρόγραμμά μας.
Στατιστικά:

RMSE (Root Mean Square Error):  RMSE = √(Σ(error_x² + error_y²)/n)
Τυπική Απόκλιση: σ = √(Σ(errorᵢ - μ)²/(n-1))
Διάστημα Εμπιστοσύνης 95%: CI = 1.96 × σ/√n

Συντελεστής Ασυμμετρίας (Skewness):  γ₁ = Σ[(Xᵢ - μ)³] / (n × σ³)
Ερμηνεία:
γ₁ > 0: Δεξιά ασυμμετρία (περισσότερα μικρά σφάλματα, λίγα μεγάλα)
γ₁ ≈ 0: Συμμετρική κατανομή
γ₁ < 0: Αριστερή ασυμμετρία (περισσότερα μεγάλα σφάλματα)

Κύρτωση (Kurtosis):
γ₂ = (Σ[(Xᵢ - μ)⁴] / (n × σ⁴)) - 3 
Ερμηνεία:
γ₂ > 0: "Leptokurtic" - απότομη κορυφή, παχιές ουρές (περισσότερες ακραίες τιμές)
γ₂ ≈ 0: "Mesokurtic" - κανονική κατανομή
γ₂ < 0: "Platykurtic" - επίπεδη κορυφή, λεπτές ουρές (λιγότερες ακραίες τιμές)

Μπορείτε να το κατεβάσετε από εδώ: TransformAfin V1.0

Το πρόγραμμα αυτό είναι πάντα σε έκδοση ΒΕΤΑ και διατίθεται δωρεάν για δοκιμές με αποκλειστικά δική σας ευθύνη. Αν διαπιστώσετε κάποιο πρόβλημα και θέλετε να βοηθήσετε το εγχείρημα κάθε παρατήρηση ειναι ευπρόσδεκτη στο email: panosbogris[παπακι]gmail.com

ΔΗΛΩΣΗ ΑΠΟΠΟΙΗΣΗΣ ΕΥΘΥΝΗΣ

Το προγραμμα αυτό αποτελεί προιόν προσωπικής εργασίας και διατίθεται δωρεάν με τον όρο να μην αλλοιωθεί ο κώδικάς του. Δεν παύει όμως να είναι ένα εκτελέσιμο πρόγραμμα που κατεβάζετε από το διαδίκτυο και μπορεί να προκαλέσει ζημιά στον υπολογιστή ή στην εργασία σας είτε, απο εσφαλμένη λειτουργία είτε, απο εγκατάσταση κακόβουλου λογισμικού απο τρίτους. Για αυτό το λόγο μην το χρησιμοποιήσετε αν δεν το κατεβάσετε οι ίδιοι από αυτή τη σελίδα, το ελέγξετε με καποιο πρόγραμμα προστασίας από κακοβουλο λογισμικό και χωρίς να είναι σαφές σε εσας οτι το χρησιμοποιείτε αποκλειστικά με δική σας ευθύνη καθως και, ότι ο προγραμματιστής καμια ευθύνη δεν φέρει και αναλαμβάνει για οποιασδήποτε ζημιά προκύψει στον εξοπλισμό σας με τη χρήση του ή στην εργασίας σας εξαιτίας εσφαλμένων αποτελεσμάτων.

This program is a product of personal work and is provided free of charge, on the condition that its code is not altered. However, it remains an executable program that you download from the internet, which could potentially cause damage to your computer or your work, either due to faulty operation or the installation of malicious software by third parties. For this reason, do not use it if you did not download it yourselves from this page, scan it with an anti-malware program, and be aware that you use it at your own risk. The developer assumes no responsibility for any damage to your equipment resulting from its use or to your work due to incorrect results.