|
前情回顾 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, } } |
我搞错了,但是代码对了![]() ![]() 点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/csiqdtr4ukfbg1i8v5og |
2#
2024-11-2 12:18:16
回复
收起回复
提升卡
观察者
