| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Interpolation z-wert in 3d-fläche (2883 mal gelesen)
|
itrvolk Mitglied Dipl.-Ing.(FH) Vermessungsingenieur
Beiträge: 113 Registriert: 05.06.2001 Infrastructure Design Suite Prof. 2017 Windows 7 64bit
|
erstellt am: 08. Mrz. 2006 15:56 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, wer kann mir weiterhelfen. Folgende Aufgabenstellung: Ich möchte den Z-Wert eines Punktes auf eine 3D-Fläche interpolieren. Dabei sind die Eckpunkte (3D-Fläche, Punkte mit x,y,z) gegeben. Von dem gesuchten Punkt sind die x,y-Werte vorhanden. Wie bestimme ich jetzt den z-wert des gesuchten Punkt mittels VBA. gruß jörg ------------------ Civil 3D 2006, AIS9, ADT2004, B&B Dell M60, Windows XP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sarotti Mitglied Bauingenieur
Beiträge: 74 Registriert: 14.07.2005 AutoCad 2022 64Bit Windows 10-64Bit mit 32 GByte
|
erstellt am: 08. Mrz. 2006 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
Hallo Jörg, auf die Schnelle nachfolgender Code: Private Function IntyWert(ByVal x As Double) Dim i As Integer Dim ia, ib, ic, ID, ie As Double 'Zwischenwerte für die Interpolation For i = 0 To AnzPunkte - 3 Step 2 If x >= Punkte(i) And x < Punkte(i + 2) Then ia = Punkte(i) 'xWert1 ib = Punkte(i + 2) 'xWert2 ic = x 'Zielwert x ID = Punkte(i + 1) 'yWert1 ie = Punkte(i + 3) 'yWert2 IntyWert = (ID - ie) / (ia - ib) * (ic - ib) + ie Exit For End If Next i End Function Die Funktion interpoliert den y-Wert für einen bestimmten x-Wert. Also die Variable Punkte (Dim Punkte(n) fehlt hier)stellt eine Polylinie aus x und y Werten dar. Für einen Zwischenwert x wird der y-Wert ermittelt. Du mußt bei Deinem Problem die Interpolation mehrfach durchführen. Erst Zwischenwerte für den Punkt x ermitteln, dann Zwischenwerte für den Punkt y, danach nochmals den Zielwert aus den Zwischenwerten interpolieren. Gruß Sarotti
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
itrvolk Mitglied Dipl.-Ing.(FH) Vermessungsingenieur
Beiträge: 113 Registriert: 05.06.2001
|
erstellt am: 08. Mrz. 2006 19:45 <-- editieren / zitieren --> Unities abgeben:
hallo sarotti, danke erst mal, aber ich glaube nicht, das mich deine Lösung weiterbringt. Vielleicht habe ich mein Problem unzureichend beschrieben. Also ich habe in Autocad eine Vielzahl von 3D-Flächen (Digitales Geländemodell). Nun möchte ich an einem beliebigen Punkt (x,y bekannt) den dazugehörigen z-wert auf der 3D-Fläche interpolieren. D.h. es muss eine Höheninterpolation des gesuchten Punktes auf dieser dort befindlichen Dreiecksfläche stattfinden, und hierfür bräuchte ich eine VBA-Routine bzw. wie dieser z-Wert ermittelt werden kann. gruß jörg ------------------ Civil 3D 2006, AIS9, ADT2004, B&B Dell M60, Windows XP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 08. Mrz. 2006 20:41 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
mal sehen, ob ich's noch zusammenbekomme: P1=(x1 y1 z1) P2=(x2 y2 z2) P3=(x3 y3 z3) seien 3 Punkte , die eine ebene aufspannen. P1->P2 bildet den Vektor V=(x2-x1 y2-y1 z2-z1) P1->P3 bildet den Vektor U=(x3-x1 y3-y1 z3-z1) Somit läßt sich jeder Punkt der Ebene P=(xp yp zp) = Vektor Nullpunkt-> P als Vektorsumme P=P1+t*V +s*U beschreiben, wobei t und u Parameter sind somit erhalte ich ein Gleichungssystem 1.) xp=x1+t*(x2-x1)+s*(x3-x1) 2.) yp=y1+t*(y2-y1)+s*(y3-y1) 3.) zp=z1+t*(z2-z1)+s*(z3-z1) aus Gleichung 1) und 2) lassen sich die Parameter t und s bestimmen diese in Gleichung 3) eingesezt ergibt die gesucht z-Koordinate von P Alles klar? ------------------ - Thomas - "Du bist einen uns unbekannten Weg in eine andere Form des Seins gegangen. - Wir sehen uns wieder in deinem Paradies! - Tschüß Axel.." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 08. Mrz. 2006 22:25 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
Ich lese gerade, dass dir Civil 3D 2006 zur Verfügung steht. Da ist die Funktion in VBA vorhanden. also einfach von den 3D Flächen ein DGM erzeugen und dann mit VBA die Funktion Zitat: aus der Civil 3D 2006 API Dokumentation AeccXLandLib ActiveX DLL FindElevationAtXY Method Description Returns the elevation value at the specified X,Y coordinate on the surface. Syntax: Public Function FindElevationAtXY( _ ByVal X As Double, _ ByVal Y As Double _ ) As Double Parameters X Y See Also AeccSurface Object
verwenden. ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
itrvolk Mitglied Dipl.-Ing.(FH) Vermessungsingenieur
Beiträge: 113 Registriert: 05.06.2001
|
erstellt am: 09. Mrz. 2006 09:03 <-- editieren / zitieren --> Unities abgeben:
@cadmium bingo das wars (Unities sind unterwegs) was jetzt noch super wäre, wenn aus den vielen 3dFlächen, automatisch die richtige gefunden würde auf welche zu interpolieren wäre. Vielleicht weiß ja jemand eine suchroutine, mit der geprüft werden kann innerhalb welcher 3Dfläche der gesuchte Punkt liegt. @cadhübner tipp ist ebenfalls sehr hilfreich, nur muss ich dann 2 DGM's vorhalten eines für Civil und eines für unseren Planungsaufsatz, was bei großen Gebieten die performance ziemlich herabsetzt. Meines Erachtens ist das DGM in Civil noch recht langsam in der handhabung. gruß jörg
------------------ Civil 3D 2006, AIS9, ADT2004, B&B Dell M60, Windows XP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBA-Piet Mitglied Bauingenieur
Beiträge: 15 Registriert: 07.04.2004 AutoCad 2000 Windows XP
|
erstellt am: 09. Mrz. 2006 11:43 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
Hallo Jörg, Das Thema interessiert mich auch schon länger, aber ich bin zu Matheschwach: Wie lauten denn die allgemeingültigen Gleichungen zur Bestimmung von t und s, ich kriegs nicht aufgelöst. Grüße Piet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
itrvolk Mitglied Dipl.-Ing.(FH) Vermessungsingenieur
Beiträge: 113 Registriert: 05.06.2001
|
erstellt am: 09. Mrz. 2006 11:52 <-- editieren / zitieren --> Unities abgeben:
ich setze zur vereinfachung folgende variablen ein dx2=x2-x1 und dx3=x3-x1 dy2=y2-y1 und dy3=y3-y1 dxp=xp-x1 und dyp=yp-y1 dann folgt: s= ((dxp/dx2) -(dyp/dy2))/((dx3/dx2)-(dy3/dy2)) t= (dxp-(s*dx3))/dx2 gruß jörg ------------------ Civil 3D 2006, AIS9, ADT2004, B&B Dell M60, Windows XP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBA-Piet Mitglied Bauingenieur
Beiträge: 15 Registriert: 07.04.2004 AutoCad 2000 Windows XP
|
erstellt am: 09. Mrz. 2006 13:03 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 09. Mrz. 2006 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
|
itrvolk Mitglied Dipl.-Ing.(FH) Vermessungsingenieur
Beiträge: 113 Registriert: 05.06.2001
|
erstellt am: 09. Mrz. 2006 15:30 <-- editieren / zitieren --> Unities abgeben:
@VBA-Piet Sich nicht bei mir bedanken; geht an CADmium @CADmium nochmals zu meiner ergänzenden Frage. Gibts in VBA nicht die Möglichkeit wie man die zugehörige 3DFläche herausfiltern könnte. gruß jörg ------------------ Civil 3D 2006, AIS9, ADT2004, B&B Dell M60, Windows XP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 09. Mrz. 2006 15:48 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
wenn P innerhalb des Dreieckes P1P2P3 liegt ( bzw. auf der Kontur ), so ist die Summe der Winkel P1-P-P2 +P1-P-P3 +P2-P-P3 = 360° sonst kleiner. Damit auf alle Dreiecke testen ??! Siehe dazu auch hier ------------------ - Thomas - "Du bist einen uns unbekannten Weg in eine andere Form des Seins gegangen. - Wir sehen uns wieder in deinem Paradies! - Tschüß Axel.." [Diese Nachricht wurde von CADmium am 09. Mrz. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 09. Mrz. 2006 22:03 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
Bei der Winkelmethode reicht eigentlich schon die Überprüfung, ob aller Winkel <= 180°, evt. kann das Dreieck schon beim ersten Vergleich ausscheiden. Alternativ kann man auch prüfen, ob Fläche des Dreiecks P1-P2-P3 idetisch ist mit der Summe der Teilflächen P-P1-P2, P-P2-P3 und P-P3-P1. Um die zu überprüfenden 3D Flächen vorab zu filtern, kann man prüfen, ob die Boundingbox der Flächen den prüfenden Punkt überhaupt einschließt. Ich hab auf die Schnelle nur eine LISP Variante, die lässt sich wegen der Selection Set Filter aber sicher auch in VBA umsetzen.
Code:
(defun selectfacesatpoint (pkt) (if pkt (ssget "X" (list '(0 . "3DFACE") '( -4 . "<OR") ; Bounding Boxen über den Dreiecksseiten ; kleiner größer '( -4 . "<AND") '( -4 . "<,<,*") (cons 10 pkt) '( -4 . ">,>,*") (cons 11 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . "<,<,*") (cons 11 pkt) '( -4 . ">,>,*") (cons 12 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . "<,<,*") (cons 12 pkt) '( -4 . ">,>,*") (cons 10 pkt) '( -4 . "AND>") '( -4 . "<AND") ; größer kleiner '( -4 . ">,>,*") (cons 10 pkt) '( -4 . "<,<,*") (cons 11 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . ">,>,*") (cons 11 pkt) '( -4 . "<,<,*") (cons 12 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . ">,>,*") (cons 12 pkt) '( -4 . "<,<,*") (cons 10 pkt) '( -4 . "AND>") ; teils kleiner teils größer '( -4 . "<AND") '( -4 . "<,>,*") (cons 10 pkt) '( -4 . ">,<,*") (cons 11 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . "<,>,*") (cons 11 pkt) '( -4 . ">,<,*") (cons 12 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . "<,>,*") (cons 12 pkt) '( -4 . ">,<,*") (cons 10 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . ">,<,*") (cons 10 pkt) '( -4 . "<,>,*") (cons 11 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . ">,<,*") (cons 11 pkt) '( -4 . "<,>,*") (cons 12 pkt) '( -4 . "AND>") '( -4 . "<AND") '( -4 . ">,<,*") (cons 12 pkt) '( -4 . "<,>,*") (cons 10 pkt) '( -4 . "AND>") '( -4 . "OR>") ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun C:test ( / aw) (if (setq aw (selectfacesatpoint (getpoint "\nAuswahlpunkt picken:") ) ) (command "_CHPROP" aw "" "_col" "1" "") ) (setq aw nil) ) (
------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBA-Piet Mitglied Bauingenieur
Beiträge: 15 Registriert: 07.04.2004 AutoCad 2000 Windows XP
|
erstellt am: 10. Mrz. 2006 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für itrvolk
@ CADmium also gut, Interpolation im dreidimensionalen Sinne, gibts dafür überhaupt ein Wort? Konkret möchte ich für den Kanalbau ein kleines Tool bauen, mit dem die Deckelhöhe der Schächte an die Höhen der Straße angepasst werden, durch Auswahl von 3 Höhenpunkten und dem entsprechenden Schacht. Grüße Piet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|