/// <summary> /// 先平移后旋转 /// </summary> /// <param name="angle"></param> /// <param name="point"></param> /// <param name="rotateDirection"></param> internal RotateMatrix RotateAt2D(double angle, Point3D point, ArcDirctionType rotateDirection) { if (rotateDirection == ArcDirctionType.UNKONW) { throw new Exception("ArcDirctionType is wrong."); } else if (rotateDirection == ArcDirctionType.CLOCK_WISE) { angle = -angle; } double[,] doubleNew = new double[this.m_row, this.m_col + 1]; for (int i = 0; i < this.m_row; i++) { for (int j = 0; j < this.m_col; j++) { doubleNew[i, j] = this.m_data[i, j]; } doubleNew[i, this.m_col] = 1; } angle %= 360.0; RotateMatrix result = new RotateMatrix(doubleNew).Multiply(CreateRotationRadians2D(angle * (Math.PI / 180.0), point.X, point.Y)); return(result); }
/// <summary> /// 翻转圆弧段(起点=>末尾点,末尾点=>起点,方向更改) /// </summary> /// <returns></returns> public override CurveSegment Reverse() { ArcDirctionType reverseArcDirection = ArcDirection == ArcDirctionType.CLOCK_WISE ? ArcDirctionType.UNCLOCK_WISE : ArcDirection == ArcDirctionType.UNCLOCK_WISE ? ArcDirctionType.CLOCK_WISE : ArcDirctionType.UNKONW; return(new ArcSegment(Center, EndPoint, BeginPoint, reverseArcDirection)); }
/// <summary> /// 旋转某角度 /// </summary> /// <param name="angle"></param> /// <param name="rotateDirection"></param> internal RotateMatrix Rotate2D(double angle, ArcDirctionType rotateDirection) { RotateMatrix result = RotateAt2D(angle, new Point3D() { X = 0, Y = 0, Z = 0 }, rotateDirection); return(result); }
/// <summary> /// 拷贝旋转(原始曲线段保持不变,新增一个旋转后的曲线段) /// 指定基准点,按指定方向(顺/逆时针)旋转指定角度 /// </summary> /// <param name="referencePos">旋转基准点</param> /// <param name="radian">旋转角度</param> /// <param name="rotateDirection">旋转方向</param> /// <returns>旋转后的曲线</returns> public virtual CurveSegment CopyRotate(Point3D referencePos, double radian, ArcDirctionType rotateDirection) { CurveSegment copyTemp = CloneTool.DeepClone(this, DeepCloneType.Serialize) as CurveSegment; if (copyTemp == null) { throw new ArgumentNullException("拷贝曲线(CopyRotate)时,序列化拷贝曲线段时,出现了空引用"); } copyTemp.Rotate(referencePos, radian, rotateDirection); return(copyTemp); }
/// <summary> /// 圆弧的构造 /// </summary> /// <param name="center">圆心</param> /// <param name="beginPoint">开始点坐标</param> /// <param name="endPoint">结束点坐标</param> /// <param name="arcDir">方向,默认顺时针</param> public ArcSegment(Point3D center, Point3D beginPoint, Point3D endPoint, ArcDirctionType arcDir = ArcDirctionType.CLOCK_WISE) { Center = center as Point3D; BeginPoint = beginPoint as Point3D; EndPoint = endPoint as Point3D; Radius = center.DisTo(beginPoint); BeginRadian = Center.DirTo(beginPoint); EndRadian = Center.DirTo(endPoint); ArcDirection = arcDir; }
/// <summary> /// 圆弧的构造 /// </summary> /// <param name="center">圆心</param> /// <param name="radius">半径</param> /// <param name="beginRadian">开始弧度</param> /// <param name="endRadian">结束弧度</param> /// <param name="arcDir">方向,默认顺时针</param> public ArcSegment(Point3D center, double radius, ArcDirctionType arcDir = ArcDirctionType.CLOCK_WISE, double beginRadian = 0, double endRadian = 2 *Math.PI) { Center = center as Point3D; Radius = radius; BeginRadian = (beginRadian); EndRadian = (endRadian); BeginPoint = Center.GetNextPoint(beginRadian, Radius); EndPoint = Center.GetNextPoint(endRadian, Radius); ArcDirection = arcDir; }
/// <summary> /// 坐标点绕某点旋转radian /// </summary> /// <param name="point"></param> /// <param name="referencePos"></param> /// <param name="radian"></param> /// <param name="rotateDirection"></param> /// <returns></returns> private Point3D RotatePoint(Point3D point, Point3D referencePos, double radian, ArcDirctionType rotateDirection) { radian = Math.Abs(radian); if (rotateDirection == ArcDirctionType.UNKONW) { throw new Exception("ArcDirctionType is wrong."); } else if (rotateDirection == ArcDirctionType.CLOCK_WISE) { radian = -radian; } //假设对图片上任意点(x,y),绕一个坐标点(rx0,ry0)逆时针旋转a角度后的新的坐标设为(x0, y0),有公式: //x0 = (x - rx0) * cos(a) - (y - ry0) * sin(a) + rx0; //y0 = (x - rx0) * sin(a) + (y - ry0) * cos(a) + ry0; Point3D returnPoint = new Point3D(); returnPoint.X = (point.X - referencePos.X) * Math.Cos(radian) - (point.Y - referencePos.Y) * Math.Sin(radian) + referencePos.X; returnPoint.Y = (point.X - referencePos.X) * Math.Sin(radian) + (point.Y - referencePos.Y) * Math.Cos(radian) + referencePos.Y; returnPoint.Z = point.Z; return(returnPoint); }
/// <summary> /// 根据指定基准点,旋转角度和旋转方向旋转直线段 /// </summary> /// <param name="referencePos"></param> /// <param name="radian"></param> /// <param name="rotateDirection"></param> public override void Rotate(Point3D referencePos, double radian, ArcDirctionType rotateDirection) { this.BeginPoint = RotatePoint(this.BeginPoint, referencePos, radian, rotateDirection); this.EndPoint = RotatePoint(this.EndPoint, referencePos, radian, rotateDirection); }
/// <summary> /// 设置圆弧方向 /// </summary> /// <param name="arcSegmentDirection"></param> public void SetArcSegmentDirection(ArcDirctionType arcSegmentDirection) { ArcDirection = arcSegmentDirection; }
public override void Rotate(Point3D referencePos, double radian, ArcDirctionType rotateDirection) { }
/// <summary> /// 指定基准点,按指定方向(顺/逆时针)旋转指定角度 /// </summary> /// <param name="referencePos">旋转基准点</param> /// <param name="radian">旋转角度</param> /// <param name="rotateDirection">旋转方向</param> public abstract void Rotate(Point3D referencePos, double radian, ArcDirctionType rotateDirection);