123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- using CommonAI.RTS;
- using CommonLang.Vector;
- using CommonLang;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using CommonFroms.Drawing;
- namespace GameEditorPlugin.Tools
- {
- public partial class FormCollision : Form
- {
- public enum TestType
- {
- RoundLine,
- RoundLineW,
- RoundRect,
- LineLine,
- RoundInclude,
- FanRound,
- }
- private TestType test = TestType.RoundLine;
- private Random random = new Random();
- private Color pen1 = Color.FromArgb(0xFF, 0xFF, 0, 0);
- private Color pen2 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
- private CommonLang.Vector.Round s_round = new CommonLang.Vector.Round();
- private CommonLang.Vector.Line2 s_line = new CommonLang.Vector.Line2();
- private CommonLang.Vector.Fan s_fan = new CommonLang.Vector.Fan();
- private CommonLang.Vector.Line2 mouse_line = new CommonLang.Vector.Line2();
- private float line_r = 50;
- public FormCollision()
- {
- InitializeComponent();
- combo_TestType.Text = test.ToString();
- foreach (object obj in Enum.GetValues(typeof(TestType)))
- {
- combo_TestType.Items.Add(obj.ToString());
- }
- reset();
- // {
- // s_round.x = 58.73995f;
- // s_round.y = 148.076263f;
- // s_round.r = 1f;
- //
- // mouse_line.p.x = 61.67477f;
- // mouse_line.p.y = 148.0653f;
- // mouse_line.q.x = 51.67484f;
- // mouse_line.q.y = 148.102631f;
- //
- // line_r = 0.15f;
- // }
- }
- private void btn_Reset_Click(object sender, EventArgs e)
- {
- reset();
- pictureBox1.Refresh();
- }
- private void reset()
- {
- int w = pictureBox1.Width;
- int h = pictureBox1.Height;
- s_round.x = random.Next(200, w - 400);
- s_round.y = random.Next(200, h - 400);
- s_round.r = random.Next(10, 200);
- s_line.p.SetX(random.Next(100, w - 200));
- s_line.p.SetY(random.Next(100, h - 200));
- s_line.q.SetX(random.Next(100, w - 200));
- s_line.q.SetY(random.Next(100, h - 200));
- s_fan.x = random.Next(200, w - 400);
- s_fan.y = random.Next(200, h - 400);
- s_fan.r = random.Next(10, 200);
- s_fan.direction = ((float)random.NextDouble() * CMath.PI_MUL_2);
- s_fan.angle_range = ((float)random.NextDouble() * CMath.PI_F);
- line_r = random.Next(10, 100);
- }
- private void combo_TestType_TextChanged(object sender, EventArgs e)
- {
- TestType value;
- if (Enum.TryParse<TestType>(combo_TestType.Text, out value))
- {
- test = value;
- reset();
- pictureBox1.Refresh();
- }
- }
- private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
- {
- if (e.Button == System.Windows.Forms.MouseButtons.Left)
- {
- mouse_line.q.SetX(e.X);
- mouse_line.q.SetY(e.Y);
- pictureBox1.Refresh();
- }
- }
- private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
- {
- pictureBox1.Focus();
- if (e.Button == System.Windows.Forms.MouseButtons.Left)
- {
- mouse_line.p.SetX(e.X);
- mouse_line.p.SetY(e.Y);
- mouse_line.q.SetX(e.X);
- mouse_line.q.SetY(e.Y);
- pictureBox1.Refresh();
- }
- }
- private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
- {
- if (e.Button == System.Windows.Forms.MouseButtons.Left)
- {
- mouse_line.q.SetX(e.X);
- mouse_line.q.SetY(e.Y);
- pictureBox1.Refresh();
- }
- }
- private void pictureBox1_Paint(object sender, PaintEventArgs e)
- {
- e.Graphics.FillRectangle(new SolidBrush(Color.Black), pictureBox1.DisplayRectangle);
- switch (test)
- {
- case TestType.RoundLine:
- drawRoundLine(e.Graphics);
- break;
- case TestType.RoundLineW:
- drawRoundLineW(e.Graphics);
- break;
- case TestType.RoundRect:
- drawRectRound(e.Graphics);
- break;
- case TestType.LineLine:
- drawLineLine(e.Graphics);
- break;
- case TestType.RoundInclude:
- drawRoundInclude(e.Graphics);
- break;
- case TestType.FanRound:
- drawFanRound(e.Graphics);
- break;
- }
- }
- private bool intersetctLineLine()
- {
- return CMath.intersectLine(s_line.p.X, s_line.p.Y, s_line.q.X, s_line.q.Y, mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y);
- }
- private bool intersectRectRound()
- {
- float sx = Math.Min(mouse_line.p.X, mouse_line.q.X);
- float sy = Math.Min(mouse_line.p.Y, mouse_line.q.Y);
- float dx = Math.Max(mouse_line.p.X, mouse_line.q.X);
- float dy = Math.Max(mouse_line.p.Y, mouse_line.q.Y);
- return CMath.intersectRectRound(sx, sy, dx, dy, s_round.x, s_round.y, s_round.r);
- }
- private bool intersetctRoundLine()
- {
- return CMath.intersectRoundStripCapsule(s_round.x, s_round.y, s_round.r, mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y, line_r);
- }
- private bool intersetctRoundLineW()
- {
- return CMath.intersectRoundStripWidth(s_round.x, s_round.y, s_round.r, mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y, line_r);
- }
- private bool includeRound()
- {
- float dr = CMath.getDistance(mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y);
- return CMath.includeRound2(s_round.x, s_round.y, s_round.r, mouse_line.p.X, mouse_line.p.Y, dr);
- }
- private bool intersectFanRound()
- {
- return CMath.intersectFanRound(
- s_fan.x, s_fan.y, s_fan.r,
- mouse_line.q.X, mouse_line.q.Y, line_r,
- s_fan.direction - s_fan.angle_range / 2,
- s_fan.direction + s_fan.angle_range / 2);
- }
- private void drawLineLine(Graphics g)
- {
- Color color = intersetctLineLine() ? pen2 : pen1;
- // sline
- {
- Pen pen = new Pen(color);
- g.DrawLine(pen, s_line.p.X, s_line.p.Y, s_line.q.X, s_line.q.Y);
- }
- // line move
- {
- Pen pen = new Pen(color);
- g.DrawLine(pen, mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y);
- }
- }
- private void drawRectRound(Graphics g)
- {
- Color color = intersectRectRound() ? pen2 : pen1;
- // round
- {
- SolidBrush bursh = new SolidBrush(color);
- g.FillEllipse(bursh, s_round.x - s_round.r, s_round.y - s_round.r, s_round.r * 2f, s_round.r * 2f);
- }
- {
- SolidBrush bursh = new SolidBrush(color);
- float sx = Math.Min(mouse_line.p.X, mouse_line.q.X);
- float sy = Math.Min(mouse_line.p.Y, mouse_line.q.Y);
- float dx = Math.Max(mouse_line.p.X, mouse_line.q.X);
- float dy = Math.Max(mouse_line.p.Y, mouse_line.q.Y);
- g.FillRectangle(bursh, sx, sy, dx - sx, dy - sy);
- }
- }
- private void drawRoundLine(Graphics g)
- {
- Color color = intersetctRoundLine() ? pen2 : pen1;
- // round
- {
- SolidBrush bursh = new SolidBrush(color);
- g.FillEllipse(bursh, s_round.x - s_round.r, s_round.y - s_round.r, s_round.r * 2f, s_round.r * 2f);
- }
- // line move
- {
- SolidBrush bursh = new SolidBrush(color);
- g.FillEllipse(bursh, mouse_line.p.X - line_r, mouse_line.p.Y - line_r, line_r * 2f, line_r * 2f);
- g.FillEllipse(bursh, mouse_line.q.X - line_r, mouse_line.q.Y - line_r, line_r * 2f, line_r * 2f);
- Pen pen = new Pen(color);
- pen.Width = line_r * 2f;
- g.DrawLine(pen, mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y);
- }
- }
- private void drawRoundLineW(Graphics g)
- {
- Color color = intersetctRoundLineW() ? pen2 : pen1;
- // round
- {
- SolidBrush bursh = new SolidBrush(color);
- g.FillEllipse(bursh, s_round.x - s_round.r, s_round.y - s_round.r, s_round.r * 2f, s_round.r * 2f);
- }
- // line move
- {
- Pen pen = new Pen(color);
- pen.Width = line_r * 2f;
- g.DrawLine(pen, mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y);
- }
- }
- private void drawRoundInclude(Graphics g)
- {
- Color color = includeRound() ? pen2 : pen1;
- // round
- {
- Pen pen = new Pen(color);
- g.DrawEllipse(pen, s_round.x - s_round.r, s_round.y - s_round.r, s_round.r * 2f, s_round.r * 2f);
- }
- // line move
- {
- Pen pen = new Pen(color);
- float dr = CMath.getDistance(mouse_line.p.X, mouse_line.p.Y, mouse_line.q.X, mouse_line.q.Y);
- g.DrawEllipse(pen, mouse_line.p.X - dr, mouse_line.p.Y - dr, dr * 2, dr * 2);
- }
- }
- private void drawFanRound(Graphics g)
- {
- Color color = intersectFanRound() ? pen2 : pen1;
- // fan
- {
- SolidBrush bursh = new SolidBrush(color);
- g.FillPie(bursh,
- s_fan.x - s_fan.r,
- s_fan.y - s_fan.r,
- s_fan.r * 2,
- s_fan.r * 2,
- CMath.RadiansToDegrees(CMath.PI_MUL_2 + s_fan.direction - s_fan.angle_range / 2),
- CMath.RadiansToDegrees(s_fan.angle_range));
- }
- // round
- {
- SolidBrush bursh = new SolidBrush(color);
- g.FillEllipse(bursh, mouse_line.q.X - line_r, mouse_line.q.Y - line_r, line_r * 2f, line_r * 2f);
- }
- }
- }
- }
|