#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)