Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Geometrie-Basics: P3 = P1 + Länge#Winkel?

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von snoopyonline an!   Senden Sie eine Private Message an snoopyonline  Schreiben Sie einen Gästebucheintrag für snoopyonline

Beiträge: 192
Registriert: 17.05.2003

erstellt am: 18. Okt. 2013 11:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Ingenieur Studio HOLLAUS an!   Senden Sie eine Private Message an Ingenieur Studio HOLLAUS  Schreiben Sie einen Gästebucheintrag für Ingenieur Studio HOLLAUS

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für snoopyonline 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 18. Okt. 2013 12:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für snoopyonline 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von snoopyonline an!   Senden Sie eine Private Message an snoopyonline  Schreiben Sie einen Gästebucheintrag für snoopyonline

Beiträge: 192
Registriert: 17.05.2003

erstellt am: 18. Okt. 2013 12:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 18. Okt. 2013 13:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für snoopyonline 10 Unities + Antwort hilfreich

... 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


Sehen Sie sich das Profil von snoopyonline an!   Senden Sie eine Private Message an snoopyonline  Schreiben Sie einen Gästebucheintrag für snoopyonline

Beiträge: 192
Registriert: 17.05.2003

erstellt am: 18. Okt. 2013 14:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 18. Okt. 2013 15:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für snoopyonline 10 Unities + Antwort hilfreich

... 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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz