水平和垂直的好弄,关键是任意角度的该怎么弄呢
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();
}
}
} }
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();
}
}
} }
g.Rotate(),好像是这个
没有必要那样精确,换了一下思路。分享一下,后面的肯定会有人遇到。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);
}
}
System.Drawing.Drawing2D.AdjustableArrowCap lineArrow =
new System.Drawing.Drawing2D.AdjustableArrowCap(4, 4, true);
p.CustomEndCap = lineArrow;
g.DrawLine(p, StarPoint, EndPoint);