/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }