日期:2013-04-26  浏览次数:20551 次

#region Using directives

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

#endregion

namespace p_polygon
{
partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public int count = 0;//顶点计数

public bool reset=false;//设复位功能标志

private struct point//顶点结构
{
public float x, y;
}

point[] pt = new point[100];

private float Max(float x,float y)
{
return(x>y?x:y);
}

private float Min(float x, float y)
{
return (x < y ? x : y);
}

private void Judge(point[] pt)//判断函数
{
float Px = float.Parse(textBox1.Text);
float Py = float.Parse(textBox2.Text);
float[] line = new float[99];
float linelast;
float flag = 1;//判断在直线左右的标志数(大于0在右,小于0在左)
bool online = false;
for (int i = 1; i < count; i++)
{
line[i - 1] = (pt[i].y - pt[i - 1].y) * Px + (pt[i - 1].x - pt[i].x) * Py +
(pt[i].x - pt[i - 1].x) * pt[i - 1].y - (pt[i].y - pt[i - 1].y) * pt[i - 1].x;
if (line[i - 1] == 0 && Px <= Max(pt[i].x, pt[i - 1].x) && Px >= Min(pt[i].x, pt[i - 1].x))
online = true;
flag *= line[i - 1];
if (i == count - 1)
{
linelast = (pt[0].y - pt[i].y) * Px + (pt[i].x - pt[0].x) * Py +
(pt[0].x - pt[i].x) * pt[i].y - (pt[0].y - pt[i].y) * pt[i].x;
flag *= linelast;
if (flag == 0)
{
if (Px <= Max(pt[i].x, pt[0].x) && Py >= Min(pt[i].x, pt[0].x))
online = true;
else
online = false;
}
}

if ((flag < 0 && online == false) || (flag == 0 && online == false))
{
MessageBox.Show("the isolated point is outside the polygon");
break;
}
else if (flag == 0 && i == count - 1 && online == true)
{
MessageBox.Show("the isolated point is on the border of the polygon");
break;
}
else if (flag > 0 && i == count - 1)
{
MessageBox.Show("the isolated point is inside the polygon");
break;
}

}


}

//复位函数
private void Resetall()
{
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
textBox4.Text = "";
count = 0;
label1.Text = "0";
reset = true;
}


private void button1_Click(object sender, EventArgs e)
{
if (textBox3.Text != "" && textBox4.Text != "")
{

if (count < 100)
{
pt[count].x = float.Parse(textBox3.Text);
pt[count].y = float.Parse(textBox4.Text);
count++;
label1.Text = count.ToString();