UID1396355性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2023-9-29最后登录1970-1-1
|
前情回顾
xz/xy/zy平面点移动至其他平面 https://klpbbs.com/thread-147984-1-1.html
其实那里面说的方法,我自己都不用,因为这个方法有个严重的缺陷,就是新基底的y方向不确定,其次就是拿向量描述平面太抽象了,给我两个向量一版也想象不出来他到底在哪个平面
这次会介绍一个更加直观的方法
结尾会附上JavaScript代码
首先要说一个高中不会提的东西(你们高中提吗)
极坐标系
在三维空间中,他是以两个角和一个数字去描述向量的
这里记作(st1,st2,mod)
首先假想有一个底面,和一个原点,st1就表示相对这个底面逆时针旋转的角度,st2就表示相对这个底面在竖直方向的旋转角度,mod就是向量的模长
(表述不是很好,实在听不懂去查资料)
他和笛卡尔坐标系的转换关系为
x:mod*sin(st2)cos(st1)
y:mod*sin(st2)sin(st1)
z:mod*cos(st2)
当你理解极坐标系这两个角代表什么的时候,就可以来平移点到其他平面了
对于最基础的这个平面,想要得到其他平面最多只需要三个操作,水平方向上旋转一定角度,竖直方向上旋转一定角度,原点动一下
这里我们先考虑前两个操作
对于前两个操作,旋转的角度会直接加到极坐标系坐标上,即操作完后新坐标在极坐标系下为(st1+水平角,st2+竖直角,mod)
然后再配合我们高中学的两角和和差公式,就可以得到一个新的坐标,对基础平面上的每一个点的坐标进行相同的运算,最后再加上两个平面原点的差
得到的新点就在目标平面上,且相对远点和正方向不会有任何改变
JavaScript代码,参数1:点坐标;2:水平旋转角;3:竖直旋转角(均为弧度制)
function rotationAngle(Vector,RotationAngleBottomSurface,RotationAngleVerticalaPlane){
const {sin,cos,sqrt} = Math
const {x,y,z} = Vector
const len = sqrt(x*x+y*y)
const length = sqrt(x*x+y*y+z*z)
const cv = x / len
const sv = y / len
const czv = z / length
const szv = sqrt(1 - czv**2)
const sr = sin(RotationAngleBottomSurface)
const cr = cos(RotationAngleBottomSurface)
const szr = sin(RotationAngleVerticalaPlane)
const czr = cos(RotationAngleVerticalaPlane)
const k = sqrt(1 - (czv*czr - szv*szr)**2)
return {
x:k*length*(cv*cr - sv*sr),
y:k*length*(cr*sv + cv*sr),
z:length*(czv*czr - szv*szr) * -1,
}
}
|
|