Schnittfläche zweier überlappenden Rechtecke [gelöst]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

das wurgel

Betreff: Schnittfläche zweier überlappenden Rechtecke [gelöst]

BeitragMi, Sep 10, 2008 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo. Ich möchte wissen, wie man aus zwei Rechtecken ein drittes Rechteck ausrechnet, sodass es die überlappende Fläche der ersten beiden darstellt.

Folgende Möglichkeiten von Überlappungen gibt es:
user posted image

Ich glaub das sind alle (Falls ich mich irre informiert mich bitte Smile )

Danke schonmal
mfg das wurgel
  • Zuletzt bearbeitet von das wurgel am Mi, Sep 10, 2008 14:20, insgesamt einmal bearbeitet
 

da_poller

BeitragMi, Sep 10, 2008 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm hast du schon einen ansatz?

so grob würde ich sagen:
startx=der startx der am weitesten rechts ist
starty=der starty der am weitesten unten
endx=der endx der am weitesten links ist
endy=der endy der am weitesten oben ist..

zumindest so ohne überlegen komm ich auf dene entschluss..

das inne function packen dürfte kein problem mehr darstellen

das wurgel

BeitragMi, Sep 10, 2008 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast recht, so einfach isses

Ich bin so dämlich, das hatte ich auch schon die ganze Zeit im Kopf nur hab ich iwie dann nen denkfehler gemacht und gedacht das das alles noch viel komplizierter sei. Embarassed

Danke!
1 ist ungefähr 3

sheldon

BeitragMi, Sep 10, 2008 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei jedem Rechteck, die Breite, Höhe, X und Y festlegen, falls sie kollidieren, überprüfen, ob das zweite unten vom ersten ist, oder oben, oder sonst wo, dann z.B. wenn das 2. unten rechts vom ersten ist die Länge der Strecke von der X-Position bis zu von dem ersten die X-Position + die Breite und von dem 2. die XPos bis zur YPos des 2. + den Abstand mit dem unteren Rand des 1. und somit diese beiden Ergebnisse multiplizieren.

Edit: Oh, schon gelöst, nicht gesehen...
 

da_poller

BeitragMi, Sep 10, 2008 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ach ja die passende funktion mach ich aus langeweile auch grad(incl testool) werds nachher hier rein editieren...

lg poller

edit:
hier das versprochene tool

das umpositionieren des rechtecks ist nicht so super aber zum testen hats gereucht..

ach ja fals jmnd nen bug findet BITTE MELDEN!!

Code: [AUSKLAPPEN]
Global x1,y1,b1,h1
Global x2,y2,b2,h2
Global x3,y3,b3,h3
Global mx,my,mhl,mhr

Graphics 800,600,16,2
SetBuffer BackBuffer()

While Not KeyHit(1)
   Cls
   mx=MouseX():my=MouseY():mhl=MouseHit(1):mhr=MouseHit(2)
   If Not KeyDown(54) Then
      If mhl Then
         x1=mx
         y1=my
      EndIf
      If mhr Then
         b1=mx-x1
         h1=my-y1
      EndIf
   Else
      If mhl Then
         x2=mx
         y2=my
      EndIf
      If mhr Then
         b2=mx-x2
         h2=my-y2
      EndIf
   EndIf
   
   rectinrects()
   
   Color 255,255,255
   Text 0,0,"linke maus für start rechte maus für endpunkt"
   Text 0,15,"rechte shift für 2. rechteck"
   
   Color 255,0,0
   Rect x1,y1,b1,h1,0;rechteck 1
   Color 0,0,255
   Rect x2,y2,b2,h2,0;rechteck 2
   Color 0,255,0
   Rect x3,y3,b3,h3,1;rechteck 3
   
   Flip
Wend

Function rectinrects()
   If x1>x2 Then
      x3=x1
   Else
      x3=x2
   EndIf
   If y1>y2 Then
      y3=y1
   Else
      y3=y2
   EndIf
   If x1+b1>x2+b2 Then
      b3=x2+b2-x3
   Else
      b3=x1+b1-x3
   EndIf
   If y1+h1>y2+h2 Then
      h3=y2+h2-y3
   Else
      h3=y1+h1-y3
   EndIf
End Function

SpionAtom

BeitragMi, Sep 10, 2008 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit den Zusatzfunctions min und max ists eleganter Cool

Code: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   Repeat   
      Cls
      Rechteckueberschneidung(350, 250, 100, 100, MouseX(), MouseY(), 150, 75)
      Flip()   
   Until KeyDown(1)
   End   

   
Function Rechteckueberschneidung(x1, y1, w1, h1, x2, y2, w2, h2)

   xn = max(x1, x2)
   yn = max(y1, y2)
   wn = min(x1 + w1, x2 + w2) - xn
   hn = min(y1 + h1, y2 + h2) - yn

   Color 255, 255, 0
   Rect xn, yn, wn, hn      
   Color 255, 255, 255
   Rect x1, y1, w1, h1, 0
   Rect x2, y2, w2, h2, 0

End Function

Function min(x, y)
   If x < y Then Return x Else Return y
End Function

Function max(x, y)
   If x > y Then Return x Else Return y
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
  • Zuletzt bearbeitet von SpionAtom am Mi, Sep 10, 2008 14:55, insgesamt einmal bearbeitet
 

da_poller

BeitragMi, Sep 10, 2008 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm da hast du in der tat recht..

nur muss ich mir deine funktion noch genau anschauen wie du das gexakt machst..

ansonsten sind die beiden von der länge eig gleich

interessant andere denkweisen zu sehen.

SpionAtom

BeitragMi, Sep 10, 2008 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Gleiche Denkweise, nur andere Ausführung.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

das wurgel

BeitragMi, Sep 10, 2008 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
jo auch nich schlecht!
nachdem ich wusste wie ichs machen soll hab ich ungefähr gleichzeitig mit da_poller auche eine Function gebaut, allerdings mit Pfeiltasten.
Ich stell die jetz auch noch rein, dann ham wa nämlich eine schöne Sammlung hier:
Code: [AUSKLAPPEN]
Graphics 800, 600, 16, 2

Global InterR_X
Global InterR_Y
Global InterR_W
Global InterR_H

SetBuffer BackBuffer()
Repeat
   
   Color 153, 78, 89
   Rect 300, 200, 100, 200
   
   Color 88, 204, 12
   Rect x, y, 200, 100
   
   x=x+KeyDown(205)-KeyDown(203)
   y=y+KeyDown(208)-KeyDown(200)
   
   IntersectRect(300, 200, 100, 200, x,y,200, 100)
   
   Color 223, 144, 50
   Rect InterR_X, InterR_Y, InterR_W, InterR_H
   
   AppTitle InterR_X+ ", " +InterR_Y+ ", " +InterR_W+ ", " +InterR_H
   
   Flip
   Cls
Forever

Function IntersectRect(x1,y1,w1,h1,x2,y2,w2,h2)
   If (x2 > x1) Then
      InterR_X = x2
   Else
      InterR_X = x1
   EndIf
   
   If (x2 + w2 > x1 + w1) Then
      InterR_W = (x1 + w1) - InterR_X
   Else
      InterR_W = (x2 + w2) - InterR_X
   EndIf
   
   If (y2 > y1) Then
      InterR_Y = y2
   Else
      InterR_Y = y1
   EndIf
   
   If (y2 + h2 > y1 + h1) Then
      InterR_H = (y1 + h1) - InterR_Y
   Else
      InterR_H = (y2 + h2) - InterR_Y
   EndIf
End Function
1 ist ungefähr 3

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group