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

![]() |
das wurgelBetreff: Schnittfläche zweier überlappenden Rechtecke [gelöst] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: Ich glaub das sind alle (Falls ich mich irre informiert mich bitte ![]() Danke schonmal mfg das wurgel |
||
- Zuletzt bearbeitet von das wurgel am Mi, Sep 10, 2008 14:20, insgesamt einmal bearbeitet
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() Danke! |
||
1 ist ungefähr 3 |
![]() |
sheldon |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit den Zusatzfunctions min und max ists eleganter ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gleiche Denkweise, nur andere Ausführung. | ||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group