Punkt innerhalb oder außerhalb vom Polygon ?
Übersicht

KrümelBetreff: Punkt innerhalb oder außerhalb vom Polygon ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hier ist eine kleine Routine um zu Testen, ob sich ein
Punkt innerhalb eines Polygons befindet. *jetzt mit Kommentaren und linker/rechter Maustaste * ![]() Code: [AUSKLAPPEN] ;funktion zum testen ob ein punkt im polygon ist Graphics 640 , 480 , 16 , 2 SetBuffer BackBuffer() ;types zum erstellen des polygons: Type Point2D ; die eckpunkte des polygons Field X , Y End Type Type Line2D ; enthält jeweils 2 eckpunkte, die verbunden werden Field P1.Point2D , P2.Point2D End Type Function InsidePolygon(X , Y) ;die funktion: ;es wird gezählt, wie oft ein strahl der bei X/Y beginnt eine polygonkante schneidet. ;ist die anzahl der gesschnittenen kanten ungerade, muß sich der punkt im inneren ;des polygons befinden, sonst ist es aussen. For l.Line2D = Each Line2D If (l\P1\X-X) < 0 And (l\P2\X-X) >= 0 If ( -(l\P2\Y-l\P1\Y) * (l\P1\X-X) + (l\P2\X-l\P1\X) * (l\P1\Y-Y) ) < 0 Count = Count + 1 ElseIf (l\P2\X-X) < 0 And (l\P1\X-X) >= 0 If ( -(l\P1\Y-l\P2\Y) * (l\P2\X-X) + (l\P1\X-l\P2\X) * (l\P2\Y-Y) ) < 0 Count = Count + 1 EndIf Next If Int(Count*0.5) <> (Count * 0.5) Return True End Function While Not KeyHit(1) ;ein polygon zeichnen: If MouseHit(1) Or MouseHit(2) ;mausklick - polygonpunkt setzen P2.Point2D = P1.Point2D P1.Point2D = New Point2D P1\X = MouseX() P1\Y = MouseY() If P2.Point2D<>Null ;mehr als 1 punkt vorhanden? ;wenn ja - alten und neuen punkt mit linie verbinden l1.Line2D = New Line2D l1\P1 = P1 l1\P2 = P2 LineCount = LineCount + 1 If LineCount > 1 ;mehr als 1 linie vorhanden? ;wenn ja - polygonanfang und -ende schließen If tmpLine.Line2D <> Null Delete tmpLine tmpLine = New Line2D tmpLine\P1 = First Point2D tmpLine\P2 = P1 EndIf EndIf EndIf ;linien zeichnen: For l.Line2D = Each Line2D Line l\P1\X , l\P1\Y , l\P2\X , l\P2\Y Next ;punkte zeichnen: For p.Point2D = Each Point2D Oval p\X - 4 , p\Y - 4 , 8 , 8 Next ;testen ob mauscursor im polygon ist: If InsidePolygon(MouseX() , MouseY()) ;JA Color 255,0,0 : Text MouseX() + 15 , MouseY() , "INSIDE" Else ;NÖ Color 0,255,0 : Text MouseX() + 15 , MouseY() , "OUTSIDE" EndIf Color 255,255,255 : Text 0,0,"rechte Maustaste = polygon zeichen" Flip 0 Cls Wend |
||
- Zuletzt bearbeitet von Krümel am Fr, Jan 26, 2007 20:51, insgesamt 2-mal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
~VERSCHOBEN~ Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde. Das ist ein Fall fürs Codearchiv. Sehr schöner Code, nur könntest du ihn für Beginner noch etwas kommentieren ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gefällt mir auch. Allerdings geht das nur mit der linken Maustaste und nicht mit der rechten ^^ | ||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wirklich ein sehr schöner Code! Ich hab zwar noch nicht ganz verstanden wie er funktioniert, aber das wird hoffentlich noch ![]() Außerdem ist die Geschwindigkeit einfach nur überragend! |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das gabs auch schonmal, und das ganze mit Hilfslinien, damit man weiß wie es funktioniert.
(edit: richtigen Link angefügt) https://www.blitzforum.de/foru...11662& |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, er hat das gleiche Prinzip verwendet wie ich (habs mir aber ebenfalls selbst ausgedacht)
Ich habe noch ein paar Kleinigkeiten im meiner Funktion überarbeitet. Sie sieht jetzt so aus: Code: [AUSKLAPPEN] Function InsidePolygon(X , Y) For l.Line2D=Each Line2D If (l\P1\X-X) > 0 And (l\P2\X-X) <= 0 If ( (l\P1\Y-l\P2\Y) * (l\P1\X-X)) + ((l\P2\X-l\P1\X) * (l\P1\Y-Y)) < 0 Inside = Not Inside ElseIf (l\P1\X-X) <=0 And (l\P2\X-X) > 0 If ( (l\P1\Y-l\P2\Y) * (l\P1\X-X)) + ((l\P2\X-l\P1\X) * (l\P1\Y-Y)) >=0 Inside = Not Inside EndIf Next If Inside Return True End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group