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)
{
}
}
}
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.
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
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.
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).