Exemplo n.º 1
0
        /// <summary>
        /// 计算(R-P)和(Q-P)的叉积
        /// </summary>
        /// <param name="P">点P</param>
        /// <param name="Q">点Q</param>
        /// <param name="R">点R</param>
        /// <returns>返回叉积值</returns>
        /// <remarks>
        /// 返回值 大于0 R在矢量PQ的逆时针方向
        /// 返回值 等于0 R,P,Q 三点共线
        /// 返回值 小于0 R在矢量PQ的顺时针方向
        /// </remarks>
        public static Double Multiple(PointD P, PointD Q, PointD R)
        {
            PointD RP = PointAlgorithm.Substract(R, P); //R-P
            PointD QP = PointAlgorithm.Substract(Q, P); //Q-P

            return(PointAlgorithm.Multiple(RP, QP));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 计算(R-P)和(Q-P)的叉积
        /// </summary>
        /// <param name="P">点P</param>
        /// <param name="Q">点Q</param>
        /// <param name="R">点R</param>
        /// <returns>返回叉积值</returns>
        /// <remarks>
        /// 返回值 大于0 R在矢量PQ的逆时针方向
        /// 返回值 等于0 R,P,Q 三点共线
        /// 返回值 小于0 R在矢量PQ的顺时针方向
        /// </remarks>
        public static Int32 Multiple(PointI P, PointI Q, PointI R)
        {
            PointI RP = PointAlgorithm.Substract(R, P); //R-P
            PointI QP = PointAlgorithm.Substract(Q, P); //Q-P

            return(PointAlgorithm.Multiple(RP, QP));
        }
Exemplo n.º 3
0
 /// <summary>
 /// 判断点与线的位置
 /// </summary>
 /// <param name="P">P点</param>
 /// <param name="Q">Q点</param>
 /// <param name="R">R点</param>
 /// <returns>返回偏转方向</returns>
 /// <remarks>
 /// 假设L线的是 P->Q PQ为线的2个顶点
 /// 返回值 大于 0 , 则PQ在R点拐向右侧后得到QR,等同于点R在PQ线段的右侧
 /// 返回值 小于 0 , 则PQ在R点拐向左侧后得到QR,等同于点R在PQ线段的左侧
 /// 返回值 等于 0 , 则P,Q,R三点共线。
 /// </remarks>
 public static Int32 Position(PointI P, PointI Q, PointI R)
 {
     //PointI RP = PointAlgorithm.Substract(R, P);//R-P
     //PointI QP = PointAlgorithm.Substract(Q, P);//Q-P
     //return PointAlgorithm.Multiple(RP, QP);
     return(PointAlgorithm.Multiple(P, Q, R));
 }
Exemplo n.º 4
0
 /// <summary>
 /// 判断点与线的位置
 /// </summary>
 /// <param name="P">P点</param>
 /// <param name="Q">Q点</param>
 /// <param name="R">R点</param>
 /// <returns>返回偏转方向</returns>
 /// <remarks>
 /// 假设L线的是 P->Q PQ为线的2个顶点
 /// 返回值 大于 0 , 则PQ在R点拐向右侧后得到QR,等同于点R在PQ线段的右侧
 /// 返回值 小于 0 , 则PQ在R点拐向左侧后得到QR,等同于点R在PQ线段的左侧
 /// 返回值 等于 0 , 则P,Q,R三点共线。
 /// </remarks>
 public static Double Position(PointD P, PointD Q, PointD R)
 {
     //PointD RP = PointAlgorithm.Substract(R, P);//R-P
     //PointD QP = PointAlgorithm.Substract(Q, P);//Q-P
     //return PointAlgorithm.Multiple(RP, QP);
     return(PointAlgorithm.Multiple(P, Q, R));
 }
Exemplo n.º 5
0
        /// <summary>
        /// 计算多边形PG面积
        /// </summary>
        /// <param name="PG">多边形PG</param>
        /// <returns>返回面积。</returns>
        public static Double Area(PolygonI PG)
        {
            //formula  (1/2) *( (Xi*Yi+1 -Xi+1*Yi) +...)
            Double result = 0;

            for (Int32 i = 0; i < PG.Vertex.Count; ++i)
            {
                result += PointAlgorithm.Multiple(PG.Vertex[i % PG.Vertex.Count], PG.Vertex[(i + 1) % PG.Vertex.Count]);
            }
            return(System.Math.Abs(0.5 * result));
        }
Exemplo n.º 6
0
        /// <summary>
        /// 判断折线的偏转方向/线段拐向
        /// </summary>
        /// <param name="P">P点</param>
        /// <param name="Q">Q点</param>
        /// <param name="R">R点</param>
        /// <returns>返回偏转方向</returns>
        /// <remarks>
        /// 返回值 大于 0 , 则PQ在R点拐向右侧后得到QR,等同于点R在PQ线段的右侧
        /// 返回值 小于 0 , 则PQ在R点拐向左侧后得到QR,等同于点R在PQ线段的左侧
        /// 返回值 等于 0 , 则P,Q,R三点共线。
        /// </remarks>
        public static Int32 DeflectingDirection(PointI P, PointI Q, PointI R)
        {
            //formular
            //折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段PQ和QR,通过计算(R - P) * (Q - P)的符号便可以确定折线段的拐向
            //基本算法是(R-P)计算相对于P点的R点坐标,(Q-P)计算相对于P点的Q点坐标。
            //(R-P) * (Q-P)的计算结果是计算以P为相对原点,点R与点Q的顺时针,逆时针方向。
            PointI RP = PointAlgorithm.Substract(R, P); //R-P
            PointI QP = PointAlgorithm.Substract(Q, P); //Q-P

            return(PointAlgorithm.Multiple(RP, QP));
        }
Exemplo n.º 7
0
 /// <summary>
 /// 判断折线的偏转方向/线段拐向
 /// </summary>
 /// <param name="L">L线段</param>
 /// <param name="R">R点</param>
 /// <returns>返回偏转方向</returns>
 /// <remarks>
 /// 假设L线的是 P->Q PQ为线的2个顶点
 /// 返回值 大于 0 , 则PQ在R点拐向右侧后得到QR,等同于点R在PQ线段的右侧
 /// 返回值 小于 0 , 则PQ在R点拐向左侧后得到QR,等同于点R在PQ线段的左侧
 /// 返回值 等于 0 , 则P,Q,R三点共线。
 /// </remarks>
 public static Int32 Position(LineI L, PointI R)
 {
     //formular
     //折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段PQ和QR,通过计算(R - P) * (Q - P)的符号便可以确定折线段的拐向
     //基本算法是(R-P)计算相对于P点的R点坐标,(Q-P)计算相对于P点的Q点坐标。
     //(R-P) * (Q-P)的计算结果是计算以P为相对原点,点R与点Q的顺时针,逆时针方向。
     //PointI P = L.Starting;
     //PointI Q = L.End;
     //PointI RP = PointAlgorithm.Substract(R, P);//R-P
     //PointI QP = PointAlgorithm.Substract(Q, P);//Q-P
     //return PointAlgorithm.Multiple(RP, QP);
     return(PointAlgorithm.Multiple(L.Starting, L.End, R));
 }