Laden...

Intersection mit rotierendem Rechteck und Matrix

Erstellt von Sugrej vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.718 Views
S
Sugrej Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren
Intersection mit rotierendem Rechteck und Matrix

Hallo zusammen,

ich brauche eure Hilfe. Wie kann ich nachfolgenden Code zum Laufen bekommen, dass so bald das rotierende Rechteck r1 das statische Rechteck r2 erwischt die Messagebox aufgerufen wird ? Zur Zeit dreht sich das Rechteck zwar schön aber mit "IntersectsWith" kann leider kein Kollision der beiden Rechtecke festgestellt werden. Ich vermute mal das hat was mit meiner Drehmatrix zu tun oder ?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {

        float angle2;

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            angle2 = angle2 + 5;
            Invalidate();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (timer1.Enabled == false)
            {
                timer1.Enabled = true;
            }
            else if (timer1.Enabled == true)
            {
                timer1.Enabled = false;
            }
        }

        public void RotateRectangle(Graphics g, Rectangle r, float angle2)
        {
            using (Matrix m = new Matrix())
            {

                m.RotateAt(angle2, new PointF(r.Left + (r.Width / 2),
                                          r.Top + (r.Height / 2 - r.Height / 2)));
                g.Transform = m;
                g.DrawRectangle(Pens.Black, r);
                g.ResetTransform();


            }
        }

        private Rectangle r1 = new Rectangle(300, 150, 50, 100);
        private Rectangle r2 = new Rectangle(400, 200, 25, 25);

        private void Form1_Paint(object sender, PaintEventArgs e)
        {


            Graphics g = this.CreateGraphics();

            g.SmoothingMode = SmoothingMode.HighQuality;

            RotateRectangle(g, r1, angle2);
            RotateRectangle(g, r2, 0);

            if (r1.IntersectsWith(r2))
            {
                MessageBox.Show("Impact!", "BoomZackBam", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

4.931 Beiträge seit 2008
vor 5 Jahren

Hallo und willkommen,

das ist (mathematisch) etwas komplexer, s. z.B. How to check intersection between 2 rotated rectangles?

PS: Noch ein paar Verbesserungen deines Codes:


// in Button Click
timer1.Enabled = !timer1.Enabled;


// in Form Paint
// benutze übergebenen EventArgs-Parameter

Graphics g = e.Graphics;

Und die MessageBox solltest du auch nicht im Paint Ereignis anzeigen, sondern z.B. im TimerTick-Ereignis.

S
Sugrej Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren

Hi Th69,

danke für die Antwort und die Tips. Um das Snippet von der Seite benutzen zu können muss ich vorab erst zwei Polygone erstellen oder ? Wie lasse ich das eine dann wieder rotieren, so wie ich es auch mit dem Rechteck getan habe? Und noch eine Frage, ist es nicht einfacher eine Drehmatrix zu erstellen und entsprechend sich das Rechteck immer neu bzw. seine Position zu berechnen und dann entsprechen mit IntersectWith zu vergleichen?

Beste Grüße

C
2.121 Beiträge seit 2010
vor 5 Jahren

Die Matrix wirkt sich nur aufs zeichnen aus. Das Rechteck bleibt nach wie vor entlang der Koordinatenachsen. Dementsprechend wirkt sich IntersectWith auch nur auf diese Form eines Rechtecks aus, das parallel zu den Achsen liegt.

4.931 Beiträge seit 2008
vor 5 Jahren

Bei deinem bisherigen Code vergleichst du immer nur die Original-Rechtecke r1 und r2, da sich diese ja nicht ändern (die Drehung erfolgt ja über die Graphics-Klasse - und da gibt es keine IntersectsWith-Methode).