/// <summary> /// 设置位置 /// </summary> public void SetPosition() { #region 弧线 this.lineElement.Point = this.EndPoint; this.LinePathFigureElement.StartPoint = this.StartPoint; this.lineElement.IsLargeArc = this.IsLargeArc; this.lineElement.SweepDirection = this.LineSweepDirection; this.lineElement.Size = new Size(this.Radius, this.Radius); #endregion #region 箭头 Point roundCenter = new Point(); double k1; //求圆心 try { roundCenter = MathExtension.GetRoundCenter(this.StartPoint, this.EndPoint, this.Radius, this.LineSweepDirection, this.IsLargeArc); //圆心与箭头点连线的斜率 k1 = (roundCenter.Y - this.EndPoint.Y) / (roundCenter.X - this.EndPoint.X); } catch (Exception ex) { if (ex is RadiusException) { k1 = (-1) * (this.StartPoint.X - this.EndPoint.X) / (this.StartPoint.Y - this.EndPoint.Y); this.lineElement.Size = new Size(0, 1); } else { return; } } Point centerPoint1, centerPoint2, endPoint11, endPoint12, endPoint21, endPoint22; //切线斜率 double k2 = 0; if (double.IsInfinity(k1)) //与Y轴平行 { //中间点 this._CenterPoint.X = (this.StartPoint.X + this.EndPoint.X) / 2; this._CenterPoint.Y = (this.StartPoint.Y + this.EndPoint.Y) / 2; //如果是直线,直线与X轴平行 if (this.IsBeeline) { if (this.StartPoint.X < this.EndPoint.X) { this.arrowStartElement.StartPoint = new Point(this.EndPoint.X - this.ArrowSize.Height, this.EndPoint.Y - this.ArrowSize.Width); this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(new Point(this.EndPoint.X - this.ArrowSize.Height, this.EndPoint.Y + this.ArrowSize.Width)); } else { this.arrowStartElement.StartPoint = new Point(this.EndPoint.X + this.ArrowSize.Height, this.EndPoint.Y - this.ArrowSize.Width); this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(new Point(this.EndPoint.X + this.ArrowSize.Height, this.EndPoint.Y + this.ArrowSize.Width)); } } } else if (Math.Round(k1, 4) == 0)//与X轴平行 { //中间点 this._CenterPoint.X = (this.StartPoint.X + this.EndPoint.X) / 2; this._CenterPoint.Y = (this.StartPoint.Y + this.EndPoint.Y) / 2; //如果是直线 if (this.IsBeeline) { if (this.StartPoint.Y < this.EndPoint.Y) { this.arrowStartElement.StartPoint = new Point(this.EndPoint.X - this.ArrowSize.Width, this.EndPoint.Y - this.ArrowSize.Height); this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(new Point(this.EndPoint.X + this.ArrowSize.Width, this.EndPoint.Y - this.ArrowSize.Height)); } else { this.arrowStartElement.StartPoint = new Point(this.EndPoint.X - this.ArrowSize.Width, this.EndPoint.Y + this.ArrowSize.Height); this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(new Point(this.EndPoint.X + this.ArrowSize.Width, this.EndPoint.Y + this.ArrowSize.Height)); } } } else { k2 = (-1) / k1; double xOffset = this.ArrowSize.Height / (Math.Sqrt(1 + k2 * k2)); double xTemp, yTemp; #region 第一个点 xTemp = this.EndPoint.X + xOffset; yTemp = k2 * (xTemp - this.EndPoint.X) + this.EndPoint.Y; centerPoint1 = new Point(Math.Round(xTemp, 4), Math.Round(yTemp, 4)); #endregion #region 第二个点 xTemp = this.EndPoint.X - xOffset; yTemp = k2 * (xTemp - this.EndPoint.X) + this.EndPoint.Y; centerPoint2 = new Point(Math.Round(xTemp, 4), Math.Round(yTemp, 4)); #endregion k2 = k1; xOffset = this.ArrowSize.Width / (Math.Sqrt(1 + k2 * k2)); #region 第一个点对应的两个箭头端点 xTemp = centerPoint1.X + xOffset; yTemp = k2 * (xTemp - centerPoint1.X) + centerPoint1.Y; endPoint11 = new Point(Math.Round(xTemp, 4), Math.Round(yTemp, 4)); xTemp = centerPoint1.X - xOffset; yTemp = k2 * (xTemp - centerPoint1.X) + centerPoint1.Y; endPoint12 = new Point(Math.Round(xTemp, 4), Math.Round(yTemp, 4)); #endregion #region 第二个点对应的两个箭头端点 xTemp = centerPoint2.X + xOffset; yTemp = k2 * (xTemp - centerPoint2.X) + centerPoint2.Y; endPoint21 = new Point(Math.Round(xTemp, 4), Math.Round(yTemp, 4)); xTemp = centerPoint2.X - xOffset; yTemp = k2 * (xTemp - centerPoint2.X) + centerPoint2.Y; endPoint22 = new Point(Math.Round(xTemp, 4), Math.Round(yTemp, 4)); #endregion //小弧 if (!this.IsLargeArc) { #region 小弧 //如果是直线,则比较点与起点的距离,取距离近的两点 if (this.IsBeeline) { double d1 = (endPoint11.X - this.StartPoint.X) * (endPoint11.X - this.StartPoint.X) + (endPoint11.Y - this.StartPoint.Y) * (endPoint11.Y - this.StartPoint.Y); double d2 = (endPoint21.X - this.StartPoint.X) * (endPoint21.X - this.StartPoint.X) + (endPoint21.Y - this.StartPoint.Y) * (endPoint21.Y - this.StartPoint.Y); if (d1 < d2) { this.arrowStartElement.StartPoint = endPoint11; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint12); } else { this.arrowStartElement.StartPoint = endPoint21; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint22); } } else { //是否是同一边 if (MathExtension.GetPointLeftOrRight(roundCenter, this.EndPoint, this.StartPoint) == MathExtension.GetPointLeftOrRight(roundCenter, this.EndPoint, centerPoint1)) { this.arrowStartElement.StartPoint = endPoint11; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint12); } else { this.arrowStartElement.StartPoint = endPoint21; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint22); } } #endregion } else { #region 大弧 //如果是直线,则比较点与起点的距离,取距离近的两点 if (this.IsBeeline) { double d1 = (endPoint11.X - this.StartPoint.X) * (endPoint11.X - this.StartPoint.X) + (endPoint11.Y - this.StartPoint.Y) * (endPoint11.Y - this.StartPoint.Y); double d2 = (endPoint21.X - this.StartPoint.X) * (endPoint21.X - this.StartPoint.X) + (endPoint21.Y - this.StartPoint.Y) * (endPoint21.Y - this.StartPoint.Y); if (d1 < d2) { this.arrowStartElement.StartPoint = endPoint11; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint12); } else { this.arrowStartElement.StartPoint = endPoint21; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint22); } } else { //是否是不同一边 if (MathExtension.GetPointLeftOrRight(roundCenter, this.EndPoint, this.StartPoint) == (-1) * MathExtension.GetPointLeftOrRight(roundCenter, this.EndPoint, centerPoint1)) { this.arrowStartElement.StartPoint = endPoint11; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint12); } else { this.arrowStartElement.StartPoint = endPoint21; this.arrowElement.Points.Clear(); this.arrowElement.Points.Add(this.EndPoint); this.arrowElement.Points.Add(endPoint22); } } #endregion } this.GetCenterPositen(roundCenter); } #endregion }