Punkt innerhalb oder außerhalb vom Polygon ?

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krümel

Betreff: Punkt innerhalb oder außerhalb vom Polygon ?

BeitragFr, Jan 26, 2007 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist eine kleine Routine um zu Testen, ob sich ein
Punkt innerhalb eines Polygons befindet.

*jetzt mit Kommentaren und linker/rechter Maustaste * Laughing


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

BladeRunner

Moderator

BeitragFr, Jan 26, 2007 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
~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 Smile
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

BeitragFr, Jan 26, 2007 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

aMul

Sieger des Minimalist Compo 01/13

BeitragFr, Jan 26, 2007 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wirklich ein sehr schöner Code! Ich hab zwar noch nicht ganz verstanden wie er funktioniert, aber das wird hoffentlich noch Mr. Green

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

BeitragSa, Jan 27, 2007 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 27, 2007 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group