| |
 | 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
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Apr. 2008 10:52 <-- editieren / zitieren --> Unities abgeben:         
|
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 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 / zitieren --> Unities abgeben:          Nur für pistolpete1
|
pistolpete1 Mitglied Student
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Apr. 2008 11:16 <-- editieren / zitieren --> Unities abgeben:         
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
       

 Beiträge: 13530 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 10. Apr. 2008 11:20 <-- editieren / zitieren --> Unities abgeben:          Nur für pistolpete1
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
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Apr. 2008 13:55 <-- editieren / zitieren --> Unities abgeben:         
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
       

 Beiträge: 13530 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 10. Apr. 2008 14:00 <-- editieren / zitieren --> Unities abgeben:          Nur für pistolpete1
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
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Apr. 2008 15:21 <-- editieren / zitieren --> Unities abgeben:         
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
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Apr. 2008 20:29 <-- editieren / zitieren --> Unities abgeben:         
|
Stelli1 Moderator Verm.-Ing.
    
 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 / zitieren --> Unities abgeben:          Nur für pistolpete1
|
oscarr Mitglied CAD-Manager
 
 Beiträge: 198 Registriert: 02.10.2007
|
erstellt am: 15. Apr. 2008 10:08 <-- editieren / zitieren --> Unities abgeben:          Nur für pistolpete1
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
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 19. Apr. 2008 14:59 <-- editieren / zitieren --> Unities abgeben:         
|
pistolpete1 Mitglied Student
 
 Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 03. Mai. 2008 10:53 <-- editieren / zitieren --> Unities abgeben:         
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, PeterEine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |