| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Geometrie-Basics: P3 = P1 + Länge#Winkel? (760 mal gelesen)
|
snoopyonline Mitglied Architekt
Beiträge: 192 Registriert: 17.05.2003
|
erstellt am: 18. Okt. 2013 11:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, ich brauche eine kurze Hilfe zu den absoluten Geometrie-Basics in .NET: Ich ermittle in meiner Zeichnung zwei Punkte (also Point3D-Koordinaten) P1 und P2 und kann mit diesen den Richtungsvektor P1->P2 (geplättet als Vector2D reicht mir) und auf diese Weise ja auch den Winkel u. die Länge des Vektors ermitteln. Im Folgenden möchte ich aber die Koordinaten für einen neuen Punkt P3 (oder alternativ halt einen neuen Vektor P1->P3) ermitteln so dass folgendes gilt: P3 liegt auf der Strecke P1->P2 aber eine bestimmte Länge "vor" P2. (also gleicher Winkel aber "Länge = Ausgangslänge - X"). Mit welcher .NET Geometriemethode kann ich sowas realisieren? Ich komme da einfach nicht weiter... Code:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim P1 As Point3d = New Point3d(1, 1, 0) Dim P2 As Point3d = New Point3d(3, 3, 0) Dim V12 As Vector2d = New Vector2d(P2.X - P1.X, P2.Y - P1.Y) Dim winkel As Double = V12.Angle Dim laenge As Double = V12.Length Dim laenge2 As Double = laenge - 1 'MsgBox(P1.ToString & vbCrLf & P2.ToString & vbCrLf & (winkel * 180 / Math.PI) & vbCrLf & laenge) 'P3 = ???? End Sub
Vielen Dank im Voraus, Gruß, Sebastian ------------------ http://www.sebastian-schild.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 18. Okt. 2013 11:42 <-- editieren / zitieren --> Unities abgeben: Nur für snoopyonline
Hoffentlich nicht vertippt: Code: Dim P1_2D As Geometry.Point2d = New Geometry.Point2d(1, 1) Dim P2_2D As Geometry.Point2d = New Geometry.Point2d(3, 3) Dim tV21_2D As Geometry.Vector2d = P2_2D.GetVectorTo(P1_2D) 'Vektor von Punkt2 nach Punkt1 Dim tDistX As Double = 0.5 'Dein Abstand vom Punkt 2 Dim tP3_2D As Geometry.Point2d = P2_2D + (tV21_2D / tV21_2D.Length * tDistX)
------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 18. Okt. 2013 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für snoopyonline
Hallo Sebastian, das ist ja mehr eine Verständnisfrage der Vektorenrechnung. Du berechnest den Vector P1 P2 mit Vector3d vecp1p2 = P1.GetVectorTo(P2); Berechnest die Länge Double dist = vecp1p2.Length; Berechnest die neue Länge Double distNeu = dist - 10.0; und Berechnest den Vector der neuen Länge Vector3d vecp1p3 = vecp1p2.GetNormal().MultiplyBy(distNeu); Nun kann der P3 berechnet werden Point3d p3 = p1.Add(vecp1p3); Grüße! Holger
------------------ Holger Brischke Freier C#.NET-Workshop Ende Oktober geplant. Bei Interesse bitte melden! CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snoopyonline Mitglied Architekt
Beiträge: 192 Registriert: 17.05.2003
|
erstellt am: 18. Okt. 2013 12:57 <-- editieren / zitieren --> Unities abgeben:
Hallo "Hollaus", hallo Holger, vielen Dank für die beiden Wege. Funktionieren beide wunderbar und zeigen mir, dass ich kein schlechtes Gewissen deshalb haben muss, dass ich nicht selbst drauf gekommen bin. Ich habe den Weg von Hollaus noch einmal auf "Vorwärts" gestrickt (also P3 = P1 + (V12 / V12.Length * Ziellänge), da mir dies irgendwie logischer erschien als von P2 zurück zu P1 zu denken. Aber diese und die Entscheidung für eine der beiden Lösungsansätze ist sicher Geschmackssache... Grüße, Sebastian
------------------ http://www.sebastian-schild.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 18. Okt. 2013 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für snoopyonline
... da hast du sicher recht, dass es logischer ist, von p2 auszugehen. In einer Zeile siehts dann so aus: Double distNeu = 10.0; Point3d p1 = new Point3d(0.0, 0.0, 0.0); Point3d p2 = new Point3d(100.0, 100.0, 0.0); // -> P3 berechnen Point3d p3 = p2.Add(p2.GetVectorTo(p1).GetNormal().MultiplyBy(distNeu)); Grüße! Holger ------------------ Holger Brischke Freier C#.NET-Workshop Ende Oktober geplant. Bei Interesse bitte melden! CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snoopyonline Mitglied Architekt
Beiträge: 192 Registriert: 17.05.2003
|
erstellt am: 18. Okt. 2013 14:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, jetzt haben wir das Chaos perfekt und alle Varianten durchexerziert ;-) Ich hatte eigentlich sagen wollen, dass ich deine Richtung P1 + X! = P3 viel logischer fand und deshalb testeshalber den Weg von Hollaus (P2 - X! = P3) umgekehrt habe, OHNE dabei dein "GetNormal.Multiplyby(distneu)" zu verwenden... Grüße, Sebastian ------------------ http://www.sebastian-schild.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 18. Okt. 2013 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für snoopyonline
... du musst schon wissen, was du willst. XXX VOR P2 ist was anderes als XXX NACH P1 Was du brauchst und wie du das machst ist (mir egal). Was du aus den Code-Fragmenten entnehmen kannst ist doch folgendes GetVectorTo() - damit bekommst du den Vektor in der Länge und Richtung, wie dies von den Punkten her ist GetNormal() - bildet einen Vektor der Länge 1, bei dem die Richtung unverändert bleibt MultiplyBy() - skaliert dir den Vektor mit dem Faktor (ist der zu multiplizierende Vektor = 1 lang, bekommst du exakt einen Vektor mit der angegebenen Länge (Faktor)) Mit diesem Wissen ist es wohl kein Problem, beliebige Punkte zwischen 2 gegebenen Punkten zu berechnen. Willst du zum Bsp den Mittelpunkt, skalierst du den nicht normalisierten Vektor mit 0.5 Point3d p3 = p2.Add(p2.GetVectorTo(p1).MultiplyBy(0.5)); Willst du einen Punkt im Abstand X von P1 - bestimmst du den Vektor von Punkt 1 ausgehend Point3d p3 = p1.Add(p1.GetVectorTo(p2).GetNormal().MultiplyBy(X)); ... und von P2 als Ausgangspunkt Point3d p3 = p2.Add(p2.GetVectorTo(p1).GetNormal().MultiplyBy(X)); Noch Fragen? Grüße! Holger ------------------ Holger Brischke Freier C#.NET-Workshop Ende Oktober geplant. Bei Interesse bitte melden! CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |