| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Radien von Spline (3149 mal gelesen)
|
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 13. Feb. 2010 15:35 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe einen 3-Dimensionalen Spline und von dem möchte ich alle a-Einheiten den Radius des Spline in xy, xz und xyz-Richtung bestimmen. also sowas in der Art: for i as long to splinelänge step a msgbox splineRadius(x,y) msgbox splineRadius(x,z) msgbox splineRadius(x,y,z) end for nur leider gibt es weder eine Funktion um die Länge eines Spline abzufragen noch eine Funktion für den Radius. Hat jemand eine Idee? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 13. Feb. 2010 18:00 <-- editieren / zitieren -->
Hi, >> nur leider gibt es weder eine Funktion um die Länge eines Spline >> abzufragen noch eine Funktion für den RadiusBei der Länge kann ich Dir nicht rechtgeben, Du kannst die Spline in einen Typ DatabaseServices.Curve casten und damit stehen Dir Längen und Parameter zur Verfügung. Leider sehe ich das mit dem Radius wie Du, aber da mach ich Autodesk keinen Vorwurf, denn eine Spline verfügt nicht über bzw. besteht nicht aus Kreisbögen (aus mathematischer Sicht) und damit gibt's auch keinen Radius. Eine Annäherung könntest Du erzielen, wenn Du vom Punkt auf der Spline, einen Schritt entlang der Spline nach vorne und einen nach hinten Temporärpunkte rechnest, diese 3 Punkte dann zur Konstruktion eines temporaeren Bogens verwendest, der hat dann einen Radius. HTH, - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 13. Feb. 2010 18:06 <-- editieren / zitieren --> Unities abgeben:
An die Sache mit den 3 Punkten mit minimalem Abstand hab ich auch schon gedacht. Wenn meine 3 Punkten im Raum liegen kann ich daraus ja einen Bogen machen und ich habe den Radius im Raum. Wie bekomm ich den Radius am schlausten in der xy-Richtung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 13. Feb. 2010 18:24 <-- editieren / zitieren -->
Hi, >> Wie bekomm ich den Radius am schlausten in der xy-Richtung Die Punkt vor Erstellung des Bogens auf Z=0 umrechnen. - alfred - ------------------ www.hollaus.at |
Christian Blei Mitglied
Beiträge: 124 Registriert: 23.06.2008 Thinkpad W520, 16GB Win 7,Autocad 2012, ProStructures V8i4+5 , VBA, VB.NET,
|
erstellt am: 14. Feb. 2010 12:22 <-- editieren / zitieren --> Unities abgeben: Nur für Gloem
Hi, ich weiss zwar nicht worum es geht, aber gibt nicht die zweite Ableitung in einem Kurvenpunkt den Krümmunsgradius an diesem Punkt an? Den bekommt man mit > Autodesk.AutoCAD.DatabaseServices.Curve.GetSecondDerivative() as Vector3d< Die Radien in den X,Y,Z Richtungen müssten dann Vector3d.X etc sein. Vielleicht liege ich ja auch falsch. Gruss Christian Blei
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 14. Feb. 2010 13:40 <-- editieren / zitieren --> Unities abgeben: Nur für Gloem
|
Ex-Mitglied
|
erstellt am: 14. Feb. 2010 14:18 <-- editieren / zitieren -->
Hi, ok, ich geh irgendwann mal über GetXXXDerivative lernen - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 22. Feb. 2010 13:39 <-- editieren / zitieren --> Unities abgeben:
Hab es jetzt mal folgendermaßen nach Casten in ein Curve-Objekt und Berechnung der Krümmung nach dem Wikipediaartikel versucht: Code: <CommandMethod("getSplineRadiuses")> _ Public Sub getSplineRadiuses() Dim editor As Editor = Application.DocumentManager.MdiActiveDocument.Editor '--------------------------------------------------------------- ' Auswahl der Spline '--------------------------------------------------------------- ' Splines auch auf gesperrten Layern Dim getSplineOptions As New PromptEntityOptions(ControlChars.CrLf & "Bitte den zu überprüfenden Spline auswählen: ") getSplineOptions.SetRejectMessage(ControlChars.CrLf & "Es sind nur Splines erlaubt") getSplineOptions.AddAllowedClass(GetType(Spline), False) getSplineOptions.AllowObjectOnLockedLayer = True ' Auswahl der Messungslinie durch den Benutzer Dim getSplineResult As PromptEntityResult = Editor.GetEntity(getSplineOptions) ' Abbruch der Funktion durch Benutzer If (getSplineResult.Status = PromptStatus.Cancel) Then ' Beenden der Methode Exit Sub ' Ungültige Eingabe des Benutzers ElseIf Not (getSplineResult.Status = PromptStatus.OK) Then editor.WriteMessage(ControlChars.CrLf & "Keinen gültigen Spline ausgewählt" & ControlChars.CrLf) ' Beenden der Methode Exit Sub ' Spline ausgewählt Else ' Anlegen eines Transaktionsobjektes um auf die Zeichnungsdatenbank zugreifen zu können Dim trans As Transaction = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction Try ' Öffnen der Datei (Neuanlegen falls noch nicht vorhanden) Dim radiusesFileStream As FileStream = New FileStream("d:\test.csv", FileMode.OpenOrCreate, FileAccess.Write) ' Stream öffnen und an das Ende der Datei springen Dim radiusesStreamWriter As StreamWriter = New StreamWriter(radiusesFileStream) radiusesStreamWriter.BaseStream.Seek(0, SeekOrigin.End) ' Holen der Polylinie aus der Datenbank - Leserechte Dim curve As Curve = trans.GetObject(getSplineResult.ObjectId, OpenMode.ForRead) For i As Double = curve.StartParam To curve.EndParam Step 5 Dim firstDerivative As Vector3d = curve.GetFirstDerivative(curve.GetPointAtParameter(i)) Dim secondDerivative As Vector3d = curve.GetSecondDerivative(curve.GetPointAtParameter(i)) Dim kreuzprodukt As Vector3d = firstDerivative.CrossProduct(secondDerivative) Dim kruemmung As Double = Math.Abs(kreuzprodukt.Length) / Math.Pow(Math.Abs(firstDerivative.Length), 3) ' Schreiben des Eintrages in die Logdatei radiusesStreamWriter.WriteLine(i & "m;" & 1 / kruemmung & "m") Next ' Schließen des Streams und der Datei radiusesStreamWriter.Close() radiusesFileStream.Close() ' Abfangen eines evtl. auftretenden Fehlers Catch ex As System.Exception ' Beenden der Methode Exit Sub ' Schließen der Transaktion mit der Datenbank Finally trans.Dispose() End Try End If End Sub
Ein Spline durch drei Punkte (2574361.17,5834744.04,15.05), (2574361.61,5834728.29,12.55), (2574361.29,5834712.36,10.95) bekomm ich immer folgende Werte die auch wohl falsch sind: 0m;214.701891772998m 5m;3577.98627887494m 10m;244.114536859704m 15m;117.755645564372m 20m;172.827502291385m 25m;703.642338725218m 30m;340.949408462261m Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 22. Feb. 2010 13:55 <-- editieren / zitieren --> Unities abgeben:
|
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 22. Feb. 2010 14:33 <-- editieren / zitieren --> Unities abgeben:
Das Problem liegt wohl nicht an dem Programm sondern am Erstellen des Splines. Ich habe als Starttangente und Endtangente des Splines Punkte auf dem Kreis gewählt die dicht an P1 und P3 liegen und siehe da ich erhalte Werte zwischen 211 und 215 perfekt Wie mache ich das ganze aber jetzt mit 4 Punkten, da kann ich ja keinen Kreis mehr zeichnen? Kann man Splines nicht ohne Start und Endtangente konstruieren? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian Blei Mitglied
Beiträge: 124 Registriert: 23.06.2008 Thinkpad W520, 16GB Win 7,Autocad 2012, ProStructures V8i4+5 , VBA, VB.NET,
|
erstellt am: 23. Feb. 2010 09:36 <-- editieren / zitieren --> Unities abgeben: Nur für Gloem
Hi, als Typ: Bei Kurvenfunktionen wenn möglich immer über den Parameter gehen. Also direkt: tCurveGetSecondDerivative(Param). Die Eingabe über den Punkt auf der Kurve ist nicht besonders stabil. Warum > Dim kruemmung As Double = Math.Abs(kreuzprodukt.Length) / Math.Pow(Math.Abs(firstDerivative.Length), 3)< ?? Ich hätte gedacht K(param)= tcurve.secondDerivative(param) und Krümmungsradius dann R(param)=1/ K(param). (Gerade-Krümmung =0, Radius=unendlich) Aber der Krümmunggradius in einem Punkt einer Kurve hat ja auch mit einem Kreis durch drei Punkte dieser Kurve eigentlich nichts zu tun, ausser man lässt die drei Punkte konvergieren.......
Spline ohne Start und Endtangente erstellen geht meines Wissens nicht. Auch das Abfragen von Steigung und Krümmung in den Start- Endpunkten ergibt eventuell kein Ergebnis, da es sich nur um "Werte von einer Seite" handelt, da die Steigung nur die Steigung einer Halbtangente etc, ist.(Da könnte ein Knick etc. sein) Die Wahl eines Ersatzpunktes minimal neben den Start- Endpunkten ist da schon der Weg. Gruss Cristian Blei
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 24. Feb. 2010 12:22 <-- editieren / zitieren --> Unities abgeben:
|
Christian Blei Mitglied
Beiträge: 124 Registriert: 23.06.2008 Thinkpad W520, 16GB Win 7,Autocad 2012, ProStructures V8i4+5 , VBA, VB.NET,
|
erstellt am: 24. Feb. 2010 22:40 <-- editieren / zitieren --> Unities abgeben: Nur für Gloem
Hi, >Das kommt aus der Formel für "Berechnung der Krümmung für Raumkurven" aus dem Wikipedia-Artikel< Da liege ich ja meilenweit daneben. Danke für den Hinweis auf den Artikel! Gruss Christian Blei Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |