| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Innenliegende Punkte erkennen (1743 mal gelesen)
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 08. Feb. 2007 19:05 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, irgendwie krieg ichs nicht richtig hin. Ich möchte nach Oracle Spatial Daten schreiben. Dafür ist es wichtig zu wissen ob ein Punkt (später Fläche) in einer anderen liegt. Hab dafür mal eine Beispiel DVB gemacht. Für mich wäre es aber wichtig zu erkennen wenn ein Punkt genau auf der Linie liegt. Da kommt bei mir mal Innen mal Aussen Stelli EDIT: Ohne AutoCAD Funktionen. Weils nicht in AutoCAD laufen soll ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de 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: 9732 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 08. Feb. 2007 22:26 <-- editieren / zitieren --> Unities abgeben: Nur für Stelli1
Ich denke, du musst die Funktion noch um Vorabprüfungen erweitern. Zuerst mal würde ich prüfen, ob der Pickpunkt evt. sogar ein Vertexpunkt ist. Wenn nein, würde ich als nächsten prüfen (sofern nur gerade Segmente/Punktverbindungen vorkommen ist das auch recht einfach), ob der Punkt genau auf einem Segment liegt. Erst wenn beides nicht erfüllt ist, kann man prüfen, ob innen oder aussen. ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 09. Feb. 2007 23:27 <-- editieren / zitieren --> Unities abgeben: Nur für Stelli1
Abend Stelli, nachdem ich ca. 2h rumgedoktert habe und immernoch kein Ergebnis habe, gebe ich's heute zum Freitag-Abend mal auf;-) Was habe ich versucht? - hab' erstmal deine Boolean-Function in einen String gewandelt - danach wollte ich als erstes prüfen, ob der GetPoint auf einer Border liegt - mit dem RückgabeWert checkInsel="XBorder" oder checkinsel="YBorder" - danach habe ich eigentlich deine Function so belassen, wie se' is, ausser dem zusätzlichen flag ... Für die checkinsel=XBorder oder chechInsel=YBorder Kiste dachte ich, man kann ja DeltaX als auch deltaY berechnen, wobei für waagerechte Linien gelten sollte: GetPoint(0) = Prüfen ob x innerhalb eines DeltaX (also x+1 - x) liegt und DeltaX=0 >> dann wäre es eine X-Border GetPoint(1) = Prüfen ob y innerhalb eines DeltaY (also y+1 - y) liegt und DeltaY=0 >> dann wäre es eine Y-Border Bin aber irgendwie mit deinen Hoch- und Rechtswerten und dem Type ziemlich durcheinandergekommen, so dass eigentlich gar nix mehr ging;-) Aber naja, its halt Friday;-) Vielleicht kannst du ja meine Denke [auch wennse noch nicht funkt nachvollziehen] hier mal der Code, der nicht geht:
Code:
Private Sub CommandButton2_Click() Dim Koord As Variant Dim Rechtswert As Double Dim Hochwert As Double On Error Resume Next Koord = ThisDrawing.Utility.GetPoint(, Chr(10) & "Punkt klicken") If Err.Number = 0 Then On Error GoTo 0 Rechtswert = Koord(0) Hochwert = Koord(1) Me.lstPunkt.Clear Me.lstPunkt.AddItem Format(Rechtswert, "0.000") & " / " & Format(Hochwert, "0.000") 'Me.lblResult.Caption = IIf(CheckInsel(Rechtswert, Hochwert), "INNEN", "AUSSEN") Me.lblResult.Caption = CheckInsel(Rechtswert, Hochwert) 'trekkie End If On Error GoTo 0 End Sub'Function CheckInsel(Rechtswert As Double, Hochwert As Double) As Boolean Function CheckInsel(Rechtswert As Double, Hochwert As Double) As String 'trekkie Dim Nenner As Double Dim i As Long Dim Zähler As Long Dim flag As Boolean 'trekkie '******** komplette erste Scleife by trekkie, klappt aber nicht ************** For i = 1 To Punktanzahl - 1 Step 2 If (Punkte(i + 1).Rechtswert - Punkte(i).Rechtswert) < Rechtswert _ And (Punkte(i + 1).Hochwert - Punkte(i).Hochwert) = 0 Then CheckInsel = "YBorder" Exit Function ElseIf (Punkte(i + 3).Hochwert - Punkte(i + 2).Hochwert) < Hochwert _ And (Punkte(i + 3).Rechtswert - Punkte(i + 2).Rechtswert) = 0 Then CheckInsel = "XBorder" Exit Function End If Next '********** Ende Eingriff ***************************************************** For i = 1 To Punktanzahl - 1 If ((Punkte(i).Rechtswert <= Rechtswert) And (Rechtswert < Punkte(i + 1).Rechtswert)) _ Or ((Punkte(i + 1).Rechtswert <= Rechtswert) And (Rechtswert < Punkte(i).Rechtswert)) Then Nenner = Punkte(i + 1).Rechtswert - Punkte(i).Rechtswert If (Punkte(i).Hochwert + ((Rechtswert - Punkte(i).Rechtswert) * (Punkte(i + 1).Hochwert - Punkte(i).Hochwert)) / Nenner) > Hochwert Then 'CheckInsel = CheckInsel Xor True flag = flag Xor True 'trekkie If Not flag Then CheckInsel = "intern" Else CheckInsel = "extern" 'trekkie Zähler = Zähler + 1 ' Else ' CheckInsel = "extern" ' Zähler = Zähler + 1 End If End If Next i End Function
Das gilt erstmal nur für Punkte auf waagerechten oder senkrechten Linien (Boundaryabschnitten), schräg müsste auch noch irgendwie gehen, aber rund oder gar splinemässig > gute Nacht und kein Beddl;-)Ums erstmal nur für rechteckige Boundaries rauszubekommen, müsste man also denke das Delta errechnen und prüfen, ob ein GetPoint(0 oder 1) innerhalb liegt und der andre 0 ist. lg eine geodätische 'Blonde' ;;-))) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 10. Feb. 2007 09:28 <-- editieren / zitieren --> Unities abgeben: Nur für Stelli1
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 13. Feb. 2007 21:24 <-- editieren / zitieren --> Unities abgeben:
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 14. Feb. 2007 07:54 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|