我想用c#中的winform根据坐标画图,就是一条直线,请求帮小弟一下啊!
小弟的问题:想用图形学的知识,在winform中用c#画出一个类似铁路线的那种线路图,例如每个站点的坐标能够知道,那么怎么用一种算法,能够成为一个画成每两个点连接起来之后是一条直线,那么好多的两个点连接起来就能够成为一条连续的直线了。
这个算法用c#语言应该怎么样去写呢?
已经写了这几个方法了:
//画直线的方法
public void drawLine(Point startpoint, Point endpoint)
{
Graphics graphics = this.CreateGraphics();
graphics.DrawLine(new Pen(new SolidBrush(Color.Red), 5), startpoint.X, startpoint.Y, endpoint.X, endpoint.Y);
graphics.Dispose();
}
//计算所有直线上经过的点,Transfer.TransNet 这个是一个动态连接库,返回站点的在地图上的坐标值
Transfer.TransNet trasf = new Transfer.TransNet();
string[] coordinates = Tools.Text.Util.RegexMultiFilter(@"\d+,\d+", trasf.Transfer(ref szStartStation, ref this.selected_station));
this.corners = new Point[coordinates.Length];
for (int i = 0; i < coordinates.Length; i++)
{
string coordinate = coordinates[i];
string[] xy = Tools.Text.Util.RegexMultiFilter(@"\d+", coordinate);
Point point = new Point(Convert.ToInt32(xy[0]), Convert.ToInt32(xy[1]));
this.corners[i] = point;
}
帮我参考一下怎么样能够写出一个算法,能够让这个直线画出来,就是要好几个站点连接呢?还是说就是知道首尾的坐标值就可以啊?请哥哥姐姐们赐教!跪拜!
--------------------编程问答-------------------- 可以回吗 --------------------编程问答-------------------- ssssssssss --------------------编程问答-------------------- dddddddddd --------------------编程问答-------------------- BUG --------------------编程问答-------------------- BUG --------------------编程问答-------------------- 我说重点吧。
重写OnMouseDown方法,把鼠标点击的坐标记录到List里。
重写OnPaint方法,当List数量大于1时,就两个两个坐标读出来画出直线。
你自己先试一下,如果不行就电邮给我,我发个范例给你。 --------------------编程问答-------------------- graphics.DrawLines()直接绘制不行么? --------------------编程问答-------------------- 我在
DateGreadView中用graphics.DrawLines()
画轴试图都行啊 --------------------编程问答-------------------- 不知,帮顶 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
你这个动态链接库返回的是corners吗?
把这么点转成一条条的直线,声明GraphicsPath,把这些直线加进去,再绘制GraphicsPath --------------------编程问答-------------------- 按住Ctrl 连继按鼠标描点,完成后显示路径的例子。根据你自己的要求再修改程序吧。
--------------------编程问答--------------------
public partial class LineForm : Form
{
public LineForm()
{
InitializeComponent();
}
private bool m_addPoint = false;
//所有保存的绘画线
private List<Line> m_lines = new List<Line>();
//当前绘画线
private Line m_line = new Line();
protected override void OnPaint(PaintEventArgs e)
{
for (int i = 0; i < m_lines.Count; i++)
{
m_lines[i].Draw(e.Graphics);
}
base.OnPaint(e);
}
protected override void OnMouseClick(MouseEventArgs e)
{
if (m_addPoint)
{
if (m_line != null)
{
m_line.AddPoint(e.Location);
}
}
base.OnMouseClick(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Control)
{
m_addPoint = true;
}
base.OnKeyDown(e);
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (m_addPoint)
{
m_addPoint = false;
if (m_line != null)
{
m_lines.Add(m_line);
m_line = new Line();
}
Invalidate(true);
}
base.OnKeyUp(e);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
return base.ProcessCmdKey(ref msg, keyData);
}
}
public class Line : CollectionBase
{
private Pen m_pen = new Pen(new SolidBrush(Color.Red));
public void AddPoint(Point p)
{
base.List.Add(p);
}
public void Draw(Graphics g)
{
if (this.Count >= 2)
{
Point p = (Point)this.List[0];
for (int i = 1; i < this.List.Count; i++)
{
g.DrawLine(m_pen, p, (Point)this.List[i]);
p = (Point)this.List[i];
}
}
}
public Color LineColor
{
get
{
return m_pen.Color;
}
set
{
m_pen.Color = value;
}
}
}
顶 --------------------编程问答-------------------- GDI+我用过 你要静态的还是动态的?
补充:.NET技术 , 组件/控件开发