建一个类(Vector2),用于向量相关计算
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace xiangjiao
{
class Vector2
{
float m_fx;
float m_fy;
public Vector2()
{ }
public Vector2(float x, float y)
{
m_fx = x;
m_fy = y;
}
public Vector2(PointF p1, PointF p2)
{
m_fx = p2.X - p1.X;
m_fy = p2.Y - p1.Y;
}
public Vector2 add_vector(Vector2 v1)
{
float x = m_fx + v1.m_fx;
float y = m_fy + v1.m_fy;
Vector2 curV = new Vector2(x, y);
return curV;
}
public Vector2 sub_vector(Vector2 v1)
{
float x = m_fx - v1.m_fx;
float y = m_fy - v1.m_fy;
Vector2 curV = new Vector2(x, y);
return curV;
}
public float dot_multi(Vector2 v1)
{
float curValue = m_fx * v1.m_fx + m_fy * v1.m_fy;
return curValue;
}
public Vector2 scale_vector(float k)
{
float x = m_fx * k;
float y = m_fy * k;
Vector2 curV = new Vector2(x, y);
return curV;
}
public float cross_multi_value(Vector2 v1)
{
float curValue = m_fx * v1.m_fy - v1.m_fx * m_fy;
return curValue;
}
}
}
主窗体代码:
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;
namespace xiangjiao
{
public partial class Form1 : Form
{
Point m_p0;
Point m_p1;
Point m_p2;
Point m_p3;
int index = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (index == 0)
{
m_p0 = e.Location;
index++;
return;
}
if (index == 1)
{
m_p1 = e.Location;
Graphics g = this.CreateGraphics();
g.DrawLine(Pens.Red, m_p0, m_p1);
index++;
return;
}
if (index == 2)
{
m_p2 = e.Location;
index++;
return;
}
if (index == 3)
{
m_p3 = e.Location;
Graphics g = this.CreateGraphics();
g.DrawLine(Pens.Red, m_p2, m_p3);
index = 0;
bool ok1 = false;
bool ok2 = false;
//下面开始进行相互跨立判断
Vector2 vAB = new Vector2(m_p0, m_p1);
Vector2 vAC = new Vector2(m_p0, m_p2);
Vector2 vAD = new Vector2(m_p0, m_p3);
float value1 = vAB.cross_multi_value(vAC);
float value2 = vAB.cross_multi_value(vAD);
if (value1 * value2 < 0) ok1 = true;
Vector2 vCD = new Vector2(m_p2, m_p3);
Vector2 vCA = new Vector2(m_p2, m_p0);
Vector2 vCB = new Vector2(m_p2, m_p1);
float value3 = vCD.cross_multi_value(vCA);
float value4 = vCD.cross_multi_value(vCB);
if (value3 * value4 < 0) ok2 = true;
if (ok1 && ok2) MessageBox.Show(" : ) Crossed!");
else
MessageBox.Show(" : ( Not cross!");
}
}
}
}