----------1、点到直线的距离 方法(突然发现还有点小问题,如果需急用的话,用下面的第二个吧)
C#
找到响应的点(这里的点是表格的顶点,我默认的是表格中四个角的左下角为顶点)
代码
public class Test
{
/// <summary>
/// 画制定矩形的对角线,
/// </summary>
/// <param name="width">指定矩形的长</param>
/// <param name="hight">指定矩形的高(宽)</param>
public List<ZuoBiao> PrintDiagonal1(int width1, int high1)
{
DateTime startDate = DateTime.Now;
int width = width1;
int high = high1;
//对角线直线方程式: 这里 X×high+width×Y-width×high=0
//点到直线的距离:P(x0,y0)点到直线Ax+By+C=0的距离公式为:
//d=[Ax0+By0+C的绝对值]/[(A^2+B^2)的算术平方根]。
List<ZuoBiao> list = new List<ZuoBiao>();
for (int y = 0; y <= high; y++)
{
for (int x = 0; x <= width; x++)
{
double juli = Convert.ToDouble(Math.Abs(high * x + width * y - width * high)) / Math.Sqrt(high * high + width * width); // 点到直线的距离
if (juli <= Math.Sqrt(2) / 2 )
{
ZuoBiao zb = new ZuoBiao();
zb.x = x;
zb.y = y;
if ((high * x + width * y) > high * width)
{
zb.x = x-1;
zb.y = y-1;
}
if ((high * x + width * y) == high * width)
{
zb.x = x;
zb.y = y;
if (width > high)
{
zb.x = x;
zb.y = y - 1;
}
if (width < high)
{
zb.x = x - 1;
zb.y = y;
}
}
list.Add(zb);
}
}
}
DateTime endDate = DateTime.Now;
TimeSpan times = endDate - startDate;
return list;
}
}
public class ZuoBiao //用于存放坐标
{
/// <summary>
/// 画制定矩形的对角线,
/// </summary>
/// <param name="width">指定矩形的长</param>
/// <param name="hight">指定矩形的高(宽)</param>
public List<ZuoBiao> PrintDiagonal1(int width1, int high1)
{
DateTime startDate = DateTime.Now;
int width = width1;
int high = high1;
//对角线直线方程式: 这里 X×high+width×Y-width×high=0
//点到直线的距离:P(x0,y0)点到直线Ax+By+C=0的距离公式为:
//d=[Ax0+By0+C的绝对值]/[(A^2+B^2)的算术平方根]。
List<ZuoBiao> list = new List<ZuoBiao>();
for (int y = 0; y <= high; y++)
{
for (int x = 0; x <= width; x++)
{
double juli = Convert.ToDouble(Math.Abs(high * x + width * y - width * high)) / Math.Sqrt(high * high + width * width); // 点到直线的距离
if (juli <= Math.Sqrt(2) / 2 )
{
ZuoBiao zb = new ZuoBiao();
zb.x = x;
zb.y = y;
if ((high * x + width * y) > high * width)
{
zb.x = x-1;
zb.y = y-1;
}
if ((high * x + width * y) == high * width)
{
zb.x = x;
zb.y = y;
if (width > high)
{
zb.x = x;
zb.y = y - 1;
}
if (width < high)
{
zb.x = x - 1;
zb.y = y;
}
}
list.Add(zb);
}
}
}
DateTime endDate = DateTime.Now;
TimeSpan times = endDate - startDate;
return list;
}
}
public class ZuoBiao //用于存放坐标
{
public double x { get; set; }
public double y { get; set; }
}
public double x { get; set; }
public double y { get; set; }
}
画表格变色
我是放在了一个按钮的事件中,没有写注释,下次补上
代码
protected void btnPrint_Click(object sender, EventArgs e)
{
int width = txtWidth.Text.Trim() != null && txtWidth.Text.Trim() != "" ? Convert.ToInt32(txtWidth.Text.Trim()) : 0;
int high = txtHigh.Text.Trim() != null && txtHigh.Text.Trim() != "" ? Convert.ToInt32(txtHigh.Text.Trim()) : 0;
List<ZuoBiao> listZ = new Test().PrintDiagonal1(width,high);//这里式因为我把PrintDiagonal1方法放在了类库中了
string str = "<table width='"+width*20+"' height='"+high*20+"' border='1' cellpadding='0' cellspacing='0'>";
for (int tr =0; tr <high; tr++)
{
str += "<tr>";
for (int td = 0; td <width; td++)
{
string idStr = td.ToString() + tr.ToString();
string emp="<td id='"+idStr+"'></td>";
foreach (ZuoBiao zb in listZ)
{
string zbStr=zb.x.ToString()+zb.y.ToString();
if (zbStr == idStr)
{
emp = "<td id='" + idStr + "' bgcolor='#FF0000'></td>";
}
}
str += emp;
}
str += "</tr>";
}
str += "</table>";
ShowTable.InnerHtml = str;
}
{
int width = txtWidth.Text.Trim() != null && txtWidth.Text.Trim() != "" ? Convert.ToInt32(txtWidth.Text.Trim()) : 0;
int high = txtHigh.Text.Trim() != null && txtHigh.Text.Trim() != "" ? Convert.ToInt32(txtHigh.Text.Trim()) : 0;
List<ZuoBiao> listZ = new Test().PrintDiagonal1(width,high);//这里式因为我把PrintDiagonal1方法放在了类库中了
string str = "<table width='"+width*20+"' height='"+high*20+"' border='1' cellpadding='0' cellspacing='0'>";
for (int tr =0; tr <high; tr++)
{
str += "<tr>";
for (int td = 0; td <width; td++)
{
string idStr = td.ToString() + tr.ToString();
string emp="<td id='"+idStr+"'></td>";
foreach (ZuoBiao zb in listZ)
{
string zbStr=zb.x.ToString()+zb.y.ToString();
if (zbStr == idStr)
{
emp = "<td id='" + idStr + "' bgcolor='#FF0000'></td>";
}
}
str += emp;
}
str += "</tr>";
}
str += "</table>";
ShowTable.InnerHtml = str;
}
效果
-------------2、比例方法(是我一个朋友写,效果比我的更直观些)
先来看看效果
代码:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public int height = 0;
public int width = 0;
/// <summary>
/// 绘制按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
height = int.Parse(this.textBox2.Text);
width = int.Parse(this.textBox1.Text);
Form1 f = new Form1(this);
f.Show();
}
}
{
public Form2()
{
InitializeComponent();
}
public int height = 0;
public int width = 0;
/// <summary>
/// 绘制按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
height = int.Parse(this.textBox2.Text);
width = int.Parse(this.textBox1.Text);
Form1 f = new Form1(this);
f.Show();
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int height = 0;
int width = 0;
int scale = 20;
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.White);
PointF Topleft = new PointF(10, 10);
PointF Topright = new PointF(10 + width, 10);
PointF Botleft = new PointF(10, 10 + height);
PointF Botright = new PointF(10 + width, 10 + height);
for (int i = 0; i <= height; i = i + scale)
{
g.DrawLine(p, new PointF(Topleft.X, Topleft.Y + i), new PointF(Topright.X, Topright.Y + i));
}
for (int j = 0; j <= width; j = j + scale)
{
g.DrawLine(p, new PointF(Topleft.X + j, Topleft.Y), new PointF(Botleft.X + j, Botleft.Y));
}
g.DrawLine(p, Topleft, Botright);
float widthscaleheight = (float)width / (float)height;
float heightscalewidth = (float)height / (float)width;
PointF Topleftsmall = new PointF();
#region 这是重点
if (widthscaleheight > 1)
{
int[] fillPlace = new int[width / scale];
int t = 1;
float minNo = widthscaleheight;
for (int i = 1; i < width / scale + 1; i++)
{
if (minNo - 1 >= 0 || (minNo > 0.5 && minNo < 1))
{
fillPlace[i - 1] = t;
minNo -= 1;
}
else
{
minNo += widthscaleheight;
t++;
fillPlace[i - 1] = t;
minNo -= 1;
}
}
for (int i = 0; i < width / scale; i++)
{
Topleftsmall = new PointF(Topleft.X + i * scale, Topleft.Y + (fillPlace[i] - 1) * scale);
g.FillRectangle(Brushes.Red, Topleftsmall.X, Topleftsmall.Y, scale, scale);
}
}
else
{
int[] fillPlace = new int[height / scale];
int t = 1;
float minNo = heightscalewidth;
for (int i = 1; i < height / scale + 1; i++)
{
if (minNo - 1 >= 0 || (minNo > 0.5 && minNo < 1))
{
fillPlace[i - 1] = t;
minNo -= 1;
}
else
{
minNo += heightscalewidth;
t++;
fillPlace[i - 1] = t;
minNo -= 1;
}
}
for (int i = 0; i < height / scale; i++)
{
Topleftsmall = new PointF(Topleft.X + (fillPlace[i] - 1) * scale, Topleft.Y + i * scale);
g.FillRectangle(Brushes.Red, Topleftsmall.X, Topleftsmall.Y, scale, scale);
}
}
#endregion
}
public Form1(Form2 f)
{
InitializeComponent();
this.height = f.height * scale;
this.width = f.width * scale;
}
}
{
public Form1()
{
InitializeComponent();
}
int height = 0;
int width = 0;
int scale = 20;
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.White);
PointF Topleft = new PointF(10, 10);
PointF Topright = new PointF(10 + width, 10);
PointF Botleft = new PointF(10, 10 + height);
PointF Botright = new PointF(10 + width, 10 + height);
for (int i = 0; i <= height; i = i + scale)
{
g.DrawLine(p, new PointF(Topleft.X, Topleft.Y + i), new PointF(Topright.X, Topright.Y + i));
}
for (int j = 0; j <= width; j = j + scale)
{
g.DrawLine(p, new PointF(Topleft.X + j, Topleft.Y), new PointF(Botleft.X + j, Botleft.Y));
}
g.DrawLine(p, Topleft, Botright);
float widthscaleheight = (float)width / (float)height;
float heightscalewidth = (float)height / (float)width;
PointF Topleftsmall = new PointF();
#region 这是重点
if (widthscaleheight > 1)
{
int[] fillPlace = new int[width / scale];
int t = 1;
float minNo = widthscaleheight;
for (int i = 1; i < width / scale + 1; i++)
{
if (minNo - 1 >= 0 || (minNo > 0.5 && minNo < 1))
{
fillPlace[i - 1] = t;
minNo -= 1;
}
else
{
minNo += widthscaleheight;
t++;
fillPlace[i - 1] = t;
minNo -= 1;
}
}
for (int i = 0; i < width / scale; i++)
{
Topleftsmall = new PointF(Topleft.X + i * scale, Topleft.Y + (fillPlace[i] - 1) * scale);
g.FillRectangle(Brushes.Red, Topleftsmall.X, Topleftsmall.Y, scale, scale);
}
}
else
{
int[] fillPlace = new int[height / scale];
int t = 1;
float minNo = heightscalewidth;
for (int i = 1; i < height / scale + 1; i++)
{
if (minNo - 1 >= 0 || (minNo > 0.5 && minNo < 1))
{
fillPlace[i - 1] = t;
minNo -= 1;
}
else
{
minNo += heightscalewidth;
t++;
fillPlace[i - 1] = t;
minNo -= 1;
}
}
for (int i = 0; i < height / scale; i++)
{
Topleftsmall = new PointF(Topleft.X + (fillPlace[i] - 1) * scale, Topleft.Y + i * scale);
g.FillRectangle(Brushes.Red, Topleftsmall.X, Topleftsmall.Y, scale, scale);
}
}
#endregion
}
public Form1(Form2 f)
{
InitializeComponent();
this.height = f.height * scale;
this.width = f.width * scale;
}
}