C# 画直线带一个箭头 完成了大部分
水平和垂直的好弄,关键是任意角度的该怎么弄呢
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
starPointF = new PointF(0, this.Height / 2);
endPointF = new PointF(this.Width / 8 * 5, this.Height / 2);
triangleSize = new Size(10, 10);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.DrawLine(Pens.Red, starPointF, endPointF);
//这是按照水平向左的方向画图的 ,现在要实现的是任意角度,关键的是p1,p2,p3坐标怎么算的呢,
//看着真的很简单,高中知识,可是我现在解二元二次方程, 搞的我头都大了,还是不能用starPointF,endPointF,triangleSize来表示。
PointF p1 = new PointF(endPointF.X, endPointF.Y - triangleSize.Height / 2);
PointF p2 = new PointF(endPointF.X, endPointF.Y + triangleSize.Height / 2);
PointF p3 = new PointF(endPointF.X + triangleSize.Width, endPointF.Y);
Brush brush = new SolidBrush(Color.Red);
GraphicsPath path = new GraphicsPath();
path.AddLine(p1, p2);
path.AddLine(p2, p3);
path.AddLine(p3, p1);
g.FillPath(brush, path);
}
PointF starPointF = new PointF(0, 0);
PointF endPointF = new PointF(0, 0);
public PointF StarPointF
{
get { return starPointF; }
set { starPointF = value; }
}
public PointF EndPointF
{
get { return endPointF; }
set { endPointF = value; }
}
SizeF triangleSize;
/// <summary>
/// 三角形大小 ,这个是等腰三角形, 宽度表示定点到底边的距离, 高表示底边的长度
/// </summary>
public SizeF TriangleSize
{
get { return triangleSize; }
set
{
if (triangleSize != value)
{
triangleSize = value;
base.Invalidate();
}
}
}
}
--------------------编程问答-------------------- 不需要,可以绘制一个三角箭头,然后旋转,再绘制到画布上。 --------------------编程问答-------------------- 计算机绘图中,这就好像是“加减乘除”一样是超级简单的入门知识。对于一系列点(Point[]),把它们平移、旋转,不过是矩阵右乘一个(或者连续多个、根据你需要多少个旋转和平移操作而定)简单的正方矩阵。
不论是线性代数还是计算机绘图,这个都是最入门的知识。完全谈不上有让任何技术。 --------------------编程问答-------------------- 不要自己瞎推理,要找对入门思路。 --------------------编程问答-------------------- 有自带的箭头为社么不用呢 在pen的属性里 --------------------编程问答-------------------- Graphic 对象已经帮你包装好了,
g.Rotate(),好像是这个 --------------------编程问答-------------------- 平移 旋转 逆平移
--------------------编程问答--------------------
那种难看,的很 自己绘制之前就搜索了一下的, 试试代码,简直超级难看。 --------------------编程问答-------------------- Graphic 就可以 --------------------编程问答-------------------- 你的水平箭头画好了啊,旋转Graphic对象,就相当于你的头转下而已! --------------------编程问答-------------------- 呵呵,可以设置的,显示质量高点就好了,具体参数忘记了 --------------------编程问答-------------------- 撸主如果对图像有兴趣,还是应该先读一下《计算机图形学》这样入门的书籍。
能少走不少弯路节省很多瞎扯蛋的时间。 --------------------编程问答-------------------- 如果质量不好,设置g.SmoothingMode --------------------编程问答-------------------- 还是给解决掉了,基本满足要求,只是三角形我先给写死的,这个改下很简单了。
再也不去解2元2次方程的了,高中很轻松就能搞定的,现在怎么不行的了。
没有必要那样精确,换了一下思路。分享一下,后面的肯定会有人遇到。
--------------------编程问答-------------------- 一点感慨,为什么现在的C#的人,不喜欢..... --------------------编程问答--------------------
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
starPoint = new Point(0, this.Height / 2);
endPoint = new Point(this.Width / 8 * 5, this.Height / 2);
triangleSize = new Size(10, 10);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
Graphics g = e.Graphics;
g.DrawLine(Pens.Red, starPoint, endPoint);
drawLineArrow(Pens.Red, starPoint, endPoint, e);
//这是按照水平向左的方向画图的 ,现在要实现的是任意角度,关键的是p1,p2,p3坐标怎么算的呢,
//看着真的很简单,高中知识,可是我现在解二元二次方程, 搞的我头都大了,还是不能用starPoint,endPoint,triangleSize来表示。
//Point p1 = new Point(endPoint.X, endPoint.Y - triangleSize.Height / 2);
//Point p2 = new Point(endPoint.X, endPoint.Y + triangleSize.Height / 2);
//Point p3 = new Point(endPoint.X + triangleSize.Width, endPoint.Y);
//Brush brush = new SolidBrush(Color.Red);
//GraphicsPath path = new GraphicsPath();
//path.AddLine(p1, p2);
//path.AddLine(p2, p3);
//path.AddLine(p3, p1);
//g.FillPath(brush, path);
}
Point starPoint = new Point(0, 0);
Point endPoint = new Point(0, 0);
public Point StarPoint
{
get { return starPoint; }
set { starPoint = value; }
}
public Point EndPoint
{
get { return endPoint; }
set { endPoint = value; }
}
SizeF triangleSize;
/// <summary>
/// 三角形大小 ,这个是等腰三角形, 宽度表示定点到底边的距离, 高表示底边的长度
/// </summary>
public SizeF TriangleSize
{
get { return triangleSize; }
set
{
if (triangleSize != value)
{
triangleSize = value;
base.Invalidate();
}
}
}
public void drawLineArrow(Pen pen, Point startPt, Point endPt, PaintEventArgs e)
{
int x = startPt.X;
int y = startPt.Y;
int num3 = endPt.X;
int num4 = endPt.Y;
double num5 = Math.Atan2((double)(num3 - x), (double)(num4 - y));
double num6 = 0.52359877559829882;
double num7 = 8.0;
Point point = new Point();
Point point2 = new Point();
Point point3 = new Point(num3, num4);
point.X = num3 - ((int)(num7 * Math.Sin(num5 - num6)));
point.Y = num4 - ((int)(num7 * Math.Cos(num5 - num6)));
point2.X = num3 - ((int)(num7 * Math.Sin(num5 + num6)));
point2.Y = num4 - ((int)(num7 * Math.Cos(num5 + num6)));
GraphicsPath path = new GraphicsPath();
Point[] points = new Point[] { point, point2, point3 };
path.AddPolygon(points);
e.Graphics.FillPath(new SolidBrush(Color.Black), path);
}
}
不喜欢蛋定,喜欢扁别人是吧? --------------------编程问答-------------------- 在我的印象中、、貌似 画箭头、、、、两句代码就搞定了
--------------------编程问答-------------------- --------------------编程问答--------------------
Pen p = new Pen(Color.Cyan,1);
System.Drawing.Drawing2D.AdjustableArrowCap lineArrow =
new System.Drawing.Drawing2D.AdjustableArrowCap(4, 4, true);
p.CustomEndCap = lineArrow;
g.DrawLine(p, StarPoint, EndPoint);
都说了,你这难看死了还不信啊,如果我要三角形变一下呢,还是自己这个灵活。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
重点是 我也不觉得比起你的我的就有有多丑、、
--------------------编程问答-------------------- 哈哈。。上面狠狠的抽了个大嘴巴。。
补充:.NET技术 , C#