sympy: Пожалуйста, скажите мне Line.distance: я хочу расстояние со знаком плюс или минус

#matrix #vector #sympy

Вопрос:

Я пытаюсь использовать матрицу: 2D z = 0

Я хочу лучшее: 3D z<>0

направление движения линии (вправо-минус: влево-плюс)

(ссылка)

расстояние < выровнено

https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.Line.distance

расстояние < Line3D

http://lidavidm.github.io/sympy/modules/geometry/line3d.html ?#sympy.geometry.line3d.Line3D.distance

 from sympy import *
p1_2D, p2_2D,p3_2D = Point(0, 0),Point(1, 1),Point(1,-1)
print("#",Line(p1_2D, p2_2D).distance(p3_2D))
#
from sympy import *
var('cz sz tx ty tz ans')
def myMoveRotate(mySyo,myDai):
    tz=0.0
    R_z = Matrix([
           [cz,-sz, 0,  0],
           [sz, cz, 0,  0],
           [ 0,  0, 1,  0],
           [ 0,  0, 0,  1]
        ])
    M_t = Matrix([
           [ 1,  0, 0, tx],
           [ 0,  1, 0, ty],
           [ 0,  0, 1, tz],
           [ 0,  0, 0,  1]
        ])
    ans = solve(M_t * R_z * mySyo - myDai, [cz, sz, tx, ty])
    return M_t.subs({tx: ans[tx], ty: ans[ty]})*R_z.subs({cz: ans[cz], sz: ans[sz]})
def myPoint3DtoMatrix(myPoint3D):
    return Matrix(                [myPoint3D.x,myPoint3D.y,myPoint3D.z,1]   )
def myMatrix(myPoint3D):
    return Matrix([flatten(Matrix([myPoint3D.x,myPoint3D.y,myPoint3D.z,1]))]).T
sP1  =Point3D(0, 0,0)
sP2  =Point3D(1, 1,0)
sP3  =Point3D(1,-1,0)
dP1  =Point3D(0.0,0.0              ,0.0)
dP2  =Point3D(0.0,sP1.distance(sP2),0.0)
mySyo= Matrix([flatten(myPoint3DtoMatrix(sP1)),flatten(myPoint3DtoMatrix(sP2))])
myDai= Matrix([flatten(myPoint3DtoMatrix(dP1)),flatten(myPoint3DtoMatrix(dP2))])
myMR1=myMoveRotate(mySyo.T,myDai.T)**(-1)
print("#",(myMR1*myMatrix(sP3))[1])
# sqrt(2)
# -sqrt(2)
 

Я попробовал: единичный вектор и решить

 from sympy import *
var('m n vxy vz')
def myUnitVector(myPoint3D):
    myL=myPoint3D.distance((0, 0))
    return Point3D(myPoint3D.x/myL,myPoint3D.y/myL,myPoint3D.z/myL)
def myCross(p1,p2):
    s_a = Matrix([p1.x, p1.y, p1.z])
    s_b = Matrix([p2.x, p2.y, p2.z])
    ans=s_a.cross(s_b)
    return Point3D(ans[0],ans[1],ans[2])
def myDistance(p1,p2,p3):
    vxy = myUnitVector(p2 - p1)
    vz = Point3D(0, 0, 1)
    return solve(m*vxy-n*myUnitVector(myCross(vxy,vz))-p3,[m,n])[n]
p1,p2 = Point3D(0, 0,0),Point3D( 1,1,0)
p3,p4 = Point3D(1,-1,0),Point3D(-1,1,0)
print("#",myDistance(p1,p2,p3))
print("#",myDistance(p1,p2,p4))
# -sqrt(2)
# sqrt(2)