Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Punkt innerhalb von Polygon

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
  
PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
Autor Thema:  Punkt innerhalb von Polygon (2800 mal gelesen)
pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 10. Apr. 2008 10:52    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 will überprüfungen, ob ein beliebiger Punkt innerhalb eines definierten Polygons liegt. Ich schätze da gibt es sicher eine passende Funktion dafür, oder?

Liebe Grüße,
Peter

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Carsten1210
Mitglied
staatl. geprüfter Holztechniker


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

Beiträge: 1360
Registriert: 24.07.2002

AutoCAD ACA 2024
Solidworks 2022 Sp5
Enterprise PDM 2022 Sp5
Pascam Woodworks
Visual Studio 2017 Pro
Windows 10 64Bit
Dell Precision 3660
Intel Core i9-12900K
32 GB Arbeitsspeicher
2x Dell U2415

erstellt am: 10. Apr. 2008 10:59    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 pistolpete1 10 Unities + Antwort hilfreich

Hi Peter,

schau dir mal die Methode "SelectByPolygon" an.

Gruß, Carsten

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 10. Apr. 2008 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 Carsten,
danke für die Antwort!

Ich kenne die Funkion allerdings macht sie genau den umgekehrten Weg, oder? Ich erzeuge ein SSet, definiere ein Polygon und bekomme dann alle Objekte, die entweder innerhalb liegen oder kreuzen....

So:

Code:

' This example adds objects to a selection set by defining a polygon.
   
    Dim ssetObj As AcadSelectionSet
    Set ssetObj = ThisDrawing.SelectionSets.Add("TEST_SSET2")
   
    ' Add to the selection set all the objects that lie within a fence
    Dim mode As Integer
    Dim pointsArray(0 To 11) As Double
    mode = acSelectionSetFence
    pointsArray(0) = 28.2: pointsArray(1) = 17.2: pointsArray(2) = 0
    pointsArray(3) = -5: pointsArray(4) = 13: pointsArray(5) = 0
    pointsArray(6) = -3.3: pointsArray(7) = -3.6: pointsArray(8) = 0
    pointsArray(9) = 28: pointsArray(10) = -3: pointsArray(11) = 0
   
    ssetObj.SelectByPolygon mode, pointsArray

Wie müsste ich das umbauen, dass ich praktisch abfrage ob der Punkt innerhalb des Polygons liegt - TRUE oder FALSE?


Lg Petr

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13530
Registriert: 30.11.2003

ACAD 2008 Mechanical

erstellt am: 10. Apr. 2008 11: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 Nur für pistolpete1 10 Unities + Antwort hilfreich

Zieh einen Strahl von deinem Punkt aus und teste auf Schnittpunkte dieses Strahls mit dem Polygon ... ungerade anzahl von Schnittpunkte = Punkt innerhalb!

Die Mathematik und auch noch andere Lösungen findest du u.a. hier

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 10. Apr. 2008 13:55    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!

Danke für den guten Link! Ich habe mir das Ganze angeschaut und glaube diese C-Funktion müsste den Zweck erfüllen, was meinst du?

Code:

    int pnpoly(int npol, float *xp, float *yp, float x, float y)
    {
      int i, j, c = 0;
      for (i = 0, j = npol-1; i < npol; j = i++) {
        if ((((yp[i] <= y) && (y < yp[j])) | |
            ((yp[j] <= y) && (y < yp[i]))) &&
            (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
          c = !c;
      }
      return c;
    }

Aber ich glaube, diese Funktion müsste es ja auch schon längst in VBA geben, oder?


Lg Peter

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13530
Registriert: 30.11.2003

ACAD 2008 Mechanical

erstellt am: 10. Apr. 2008 14: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 pistolpete1 10 Unities + Antwort hilfreich

  
Zitat:
Original erstellt von pistolpete1:
Aber ich glaube, diese Funktion müsste es ja auch schon längst in VBA geben, oder?

Da das Universum wohl unendlich ist, und damit auch die Möglichkeiten, gibt es sicher eine Wahrscheinlichkeit > 0 , das eine VBA-Lösung für das Problem existiert.

Bei Lisp-Lösungen bin ich mir sicher   

Mann, quatsch und tipp nicht so lange rum, sondern mach einfach das Teil fertig, ist bestimmt schneller als suchen   
Und außerdem lernst'e was dabei!!

Und wenn du fertig bist, postest du die Funktion hier, damit sich der nächste Suchende drüber freunen kann!

------------------
       - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 10. Apr. 2008 15:21    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!

Dauert wohl noch ein weilchen, bis sich ein Suchender darüber freuen kann. Ich habs mal "übersetzt" und dabei ist mir aufgefallen, dass eine wichtige Abfrage fehlt, denn sonst kann es zu einer Division durch 0 kommen (siehe Beispiel). Leider funktioniert die Funktion nicht. Siehst du dabei einen Fehler (original siehe vorheriger Post)???


Ich verstehe auch das nicht:

Code:

  for (i = 0, j = npol-1; i < npol; j = i++)

Ist die Initialisierung von j im Schleifenkopf nicht sinnlos, wenn j ohnehin immer die Werte von i++ annimmt?

Code:

Sub InsidePolygon()

    Dim xpoint(0 To 4) As Double
    Dim ypoint(0 To 4) As Double
    Dim x As Double
    Dim y As Double
   
   
    xpoint(0) = 0
    xpoint(1) = 100
    xpoint(2) = 100
    xpoint(3) = 0
   
    'end point and start point are equal
    xpoint(4) = 0
       
    ypoint(0) = 0
    ypoint(1) = 0
    ypoint(2) = 100
    ypoint(3) = 100
   
    'end point and start point are equal
    ypoint(4) = 0
 
   
    x = 50
    y = 50
   
    If IsInsidePolygon(5, xpoint, ypoint, x, y) Then
        MsgBox "inside"
    Else
        MsgBox "outside"
    End If
   


End Sub

Public Function IsInsidePolygon(npol As Integer, xp() As Double, yp() As Double, x As Double, y As Double)
    Dim i As Integer, j As Integer, c As Boolean
    c = False
    j = npol - 1
    For i = 0 To npol - 1
        j = i
        If (((yp(i) <= y) And (y < yp(j))) Or _
            ((yp(j) <= y) And (y < yp(i)))) Then
               
                ' Abfrage auf 0 notwendig sonst möglicherweise Division by 0
                If (yp(j) - yp(i) + xp(i)) <> 0 And _
                (x < (xp(j) - xp(i)) * (y - yp(i)) / (yp(j) - yp(i)) + xp(i)) Then
                    c = Not c
                End If
        End If
    Next i
    IsInsidePolygon = c
End Function



Lg Peter

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 10. Apr. 2008 20:29    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

Ich glaube der Schleifenaufbau müsste so sein und ich habe oben einen Fehler (geht aber trotzdem nicht):

Code:

    j = npol - 1
    For i = 0 To npol - 1
   
        ......

        j = i + 1
    Next i


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1526
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 11. Apr. 2008 09:33    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 pistolpete1 10 Unities + Antwort hilfreich

Hallo,

ohne AutoCAD Funktionen geht es so.
Hab das nach der Streifenmethode gelöst. Der Programmcode hängt beim angegebenen Thread als DVB Datei an.

Wilfried Stelberg

------------------
Warum lisp'eln wenn's auch anders geht.
www.ib-stelberg.de

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

oscarr
Mitglied
CAD-Manager


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

Beiträge: 198
Registriert: 02.10.2007

erstellt am: 15. Apr. 2008 10:08    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 pistolpete1 10 Unities + Antwort hilfreich

Das Ding zieht eine Linie von einem MTEXT der innerhalb einer Polylinie liegt zu dessen Anfagspunkt.
Es nutzt die Strahlmethode.
Statt des MTEXT kannst du auch nen POINT oder was auch immer nehmen.

Code:

Sub allepolys()
    On Error Resume Next
    Dim ent, ent1 As AcadEntity
    Dim lineObj As AcadLine
    Dim intPoints As Variant
    Dim rayObj As AcadRay
    Dim Point1(0 To 2) As Double
    Dim Point2(0 To 2) As Double
    Dim mtext As AcadMText
    Dim poly As AcadLWPolyline
   
    For Each ent1 In ThisDrawing.ModelSpace
        If TypeOf ent1 Is AcadLWPolyline Then
       
            For Each ent In ThisDrawing.ModelSpace
                If TypeOf ent Is AcadMText Then
                    Set mtext = ent
                    Point1(0) = mtext.InsertionPoint(0): Point1(1) = mtext.InsertionPoint(1): Point1(2) = mtext.InsertionPoint(2)
                    Point2(0) = mtext.InsertionPoint(0): Point2(1) = mtext.InsertionPoint(1) + 1: Point2(2) = mtext.InsertionPoint(2)
                    Set rayObj = ThisDrawing.ModelSpace.AddRay(Point1, Point2)
                    intPoints = rayObj.IntersectWith(ent1, acExtendNone)
                    If UBound(intPoints) Mod 2 = 0 Then ' wenn ungerade ist er inerhalb
                        'Debug.Print UBound(intPoints)
                        Set poly = ent1
                        Point2(0) = poly.Coordinates(0): Point2(1) = poly.Coordinates(1): Point2(2) = poly.Coordinates(2)
                        Set lineObj = ThisDrawing.ModelSpace.AddLine(Point1, Point2)
                    End If
                    rayObj.Delete
                End If
            Next
        End If
    Next ent1
End Sub


Gruß
Holger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 19. Apr. 2008 14:59    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

Vielen Dank an alle!

Habe Stellis Lösung für meine Zwecke adaptiert.

Liebe Grüße,
Peter

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 03. Mai. 2008 10:53    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 Stelli!

Oje... ich habe zahlreiche Fälle wo die Lösung einen "Division by zero"-Fehler bringt bei der Variable dx, den ich nicht nachvollziehen kann! ZB bei folgenden Koordinaten:

Code:

    Punkt(0) = 2670.82152195498
    Punkt(1) = 1826.33205017357

    Punkte(1).Hochwert = 1832.33205017357
    Punkte(1).Rechtswert = 2671.12152195498
    Punkte(2).Hochwert = 1832.33205017357
    Punkte(2).Rechtswert = 2670.52152195498
    Punkte(3).Hochwert = 1826.33205017357
    Punkte(3).Rechtswert = 2670.52152195498
    Punkte(4).Hochwert = 1826.33205017357
    Punkte(4).Rechtswert = 2671.12152195498
    Punkte(5).Hochwert = 1832.33205017357
    Punkte(5).Rechtswert = 2671.12152195498



Ich hoffe du kannst mir weiterhelfen!
Liebe Grüße,
Peter

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)2025 CAD.de | Impressum | Datenschutz