示例#1
0
        /// <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);
        }
示例#2
0
        /// <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));
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
 /// <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;
 }
示例#6
0
 /// <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;
 }
示例#7
0
        /// <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);
        }
示例#8
0
 /// <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);
 }
示例#9
0
 /// <summary>
 /// 设置圆弧方向
 /// </summary>
 /// <param name="arcSegmentDirection"></param>
 public void SetArcSegmentDirection(ArcDirctionType arcSegmentDirection)
 {
     ArcDirection = arcSegmentDirection;
 }
示例#10
0
 public override void Rotate(Point3D referencePos, double radian, ArcDirctionType rotateDirection)
 {
 }
示例#11
0
 /// <summary>
 /// 指定基准点,按指定方向(顺/逆时针)旋转指定角度
 /// </summary>
 /// <param name="referencePos">旋转基准点</param>
 /// <param name="radian">旋转角度</param>
 /// <param name="rotateDirection">旋转方向</param>
 public abstract void Rotate(Point3D referencePos, double radian, ArcDirctionType rotateDirection);