假设直线Line1经过p1和p2点,Line2经过p3和p4点,计算两条直线的交点坐标:可以使用以下代码:
为了避免两条直线异面不相交,此处假设Line1和Line2的高度差不多,返回计算交点的x和y,z为p1的高度
返回的姿态是p2和p3点的slerp插补姿态
-- Author: chenliao@elibot.cn -- Aug.4,2023 function GetCrossPoint(point1, point2, point4, point3) -- calculate line_point1_point4 with line_point2_point3 cross point local pD_x = point1[1] local pD_y = point1[2] local pA_x = point2[1] local pA_y = point2[2] local pC_x = point3[1] local pC_y = point3[2] local pB_x = point4[1] local pB_y = point4[2] local outpos = {} outpos[1] = point1[1] outpos[2] = point1[2] outpos[3] = point1[3] outpos[4] = point1[4] outpos[5] = point1[5] outpos[6] = point1[6] outpos[2] = (pB_x * pC_y * pD_y - pD_x * pB_y * pC_y - pA_y * pB_x * pD_y + pD_x * pB_y * pA_y + pC_x * pA_y * pD_y - pA_x * pC_y * pD_y - pC_x * pB_y * pA_y + pA_x * pB_y * pC_y) / (pD_y * pC_x - pA_x * pD_y - pB_y * pC_x + pA_x * pB_y + pB_x * pC_y - pD_x * pC_y - pA_y * pB_x + pA_y * pD_x) outpos[1] = (pD_y * (pC_x - pA_x) * (pB_x - pD_x) - pA_y * (pC_x - pA_x) * (pB_x - pD_x) + pA_x * (pC_y - pA_y) * (pB_x - pD_x) + pD_x * (pD_y - pB_y) * (pC_x - pA_x)) / ((pC_y - pA_y) * (pB_x - pD_x) + (pD_y - pB_y) * (pC_x - pA_x)) return outpos end function CalCornerTarget(p1,p2,p3,p4) local p = GetCrossPoint(p1,p3,p2,p4) -- 计算p1p2和p3p4两条直线的交点(仅关注xy,返回z值同p1点的z值,避免两条直线异面不相交,返回姿态为p2和p3的slerp插补) p_ori = (p2[6]+p3[6])/2 local p_ori = get_interp_pose(p2,p3,0.5) if p==nil then return {0,0,0,p_ori[4],p_ori[5],p_ori[6]} else -- return {p[1],p[2],p[3],p2[4],p2[5],p_ori} return {p[1],p[2],p[3],p_ori[4],p_ori[5],p_ori[6]} end end v011 = {get_global_variable('V011')} v012 = {get_global_variable('V012')} v013 = {get_global_variable('V013')} v014 = {get_global_variable('V014')} v015 = CalCornerTarget(v011,v012,v013,v014)