猫史档案馆


【神奇代码岛】三角函数的应用

用户:迷失冷光迷失冷光查看:49 回复:57 评论:49 创建时间:2021-11-13T12:12:59


——————————————————————————————————————————————————

——————————————————————————————————————————————————

——————————————————————————————————————————————————

今天我们来讲讲三角函数

看图:

center_image

这是一个圆

可见向右是0°

center_image

此图中我们要求深蓝色线的长度

半径为1

浅蓝色与蓝色线之间的夹角是90°

那么深蓝色线=π/2

=1/2π

再看下图

center_image

这是蓝色线长度是上一幅图的2倍

所以蓝色线的长度是2*1/2π=π

再看

center_image

此图中蓝色线又是上一幅图的两倍

那么就再乘2:2*π=2π

 

我们得到了一个计算角度的方法

1/2π就是90°

π就是180°

2π就是360°

 

假设a=30°

用刚才的表示方法就是a=30/360*2π

那么

center_image

我们就获得了一个点

假设红点的位置是(0,0)

x坐标是0,y坐标也是0

上面有一条紫色的线和一条粉色的线

它们交汇的部分我们称之为b

那么b点也有其x坐标和y坐标

b点的x坐标是粉色线的长度

b点的y坐标是紫色线的长度

那么如何确定坐标呢?(要求背诵)

粉色线的长度是Math.cos(a)

紫色线的长度是Math.sin(a)

//a是一个模型
//b也是一个模型
b.position.y = a.position.y;
world.onTick(({tick})=>{
    b.position.x = a.position.x + Math.cos(tick * 旋转速度);
    b.position.z = a.position.z + Math.sin(tick * 旋转速度);
})

a是角度

举个例子

让模型a围绕着模型b旋转

运行一下代码

有人会觉得b模型靠a模型太近了

那么再看

center_image

此图中绿色线是粉色线长度的2倍

深红色线是紫色线长度的2倍

浅蓝色线仍然指着绿色线与深红色线的交汇点

大圆的半径是2

所以如果要让旋转距离加大的话

b.position.y = a.position.y;
world.onTick(({tick})=>{
    b.position.x = a.position.x + Math.cos(tick * 旋转速度) * 旋转半径;
    b.position.z = a.position.z + Math.sin(tick * 旋转速度) * 旋转半径;
})

现在我们已经搞懂二维旋转的原理了

下面看三维

 

以下内容高危,萌新勿入

 

如何表达球上一点

center_image

这是一个球(画的有点喵)

假设此球的半径是1

那么

center_image

 

这就像一个地球了

红色是纬线,蓝色是经线(甚)

center_image

这个球上红线是angle(角度)

蓝线是up(仰角)

绿点位置是(0,0,0)

x坐标y坐标z坐标都是0

黄色点的角度是红线的角度,仰角是蓝线的仰角

我们先来处理蓝线:

蓝色线的sin值是黄色点的y坐标

y = Math.sin(up)

然后蓝色线的cos值是球的半径

radius = Math.cos(up)

再来处理红色线:

与上文处理二维方法相似

x = Math.cos(angle)
z = Math.sin(angle)

但这是会发现如果仰角距离0°或180°较远时

黄点会不在球上

所以x、y值要乘上radius

x = Math.cos(angle) * radius;
z = Math.sin(angle) * radius;

如果发现总体距喵点太近

就需要再乘上一个radius

我们封装成一个函数

function point_in_ball(origin,angle,up,radius){
    return new Box3Vector3(
        origin.x + Math.cos(angle) * Math.cos(up) * radius,
        origin.y + Math.sin(up) * radius,
        origin.z + Math.sin(angle) * Math.cos(up) * radius
    )
}

 

然后我们说一下反求

这里就不讲解了

atan2功能就是这样

大家背诵就好了

二维:

angle = Math.atan2(y,x);

三维:

up = Math.atan2(y,Math.sqrt(x**2+z**2));
angle = Math.atan2(z,x);

上面出现的代码都是JS的

所以可以拿到编辑服里用


回复

上一页1 页 / 共 2下一页
时当日色QWQ时当日色QWQ

沙发

点赞0


评论


async_functionasync_function

awa

点赞0


评论


async_functionasync_function

可以讲讲顺时针逆时针()

点赞0


评论


async_functionasync_function

也就是sin变cos cos变sin

点赞0


评论


DebugDynamoDebugDynamo

萌新表示看不懂

点赞0


评论


想不出来叫什么想不出来叫什么

芜湖

点赞0


评论


星辰_零柒星辰_零柒

(评论区里全是大佬,除我)

点赞0


评论


未命名用户015734未命名用户015734

看懂了但没有完全看懂(什

冷光yyds

点赞1


评论


YDS尹子YDS尹子

好家伙,你真的只有六年级?

点赞0


评论


蔡宁进(大家再见)蔡宁进(大家再见)

看不懂

点赞0


评论


念满寒念满寒

评论区全是大佬(除了我)

点赞0


评论


难起的名字难起的名字

你学废了吗?emotion_doge

点赞0


评论


难起的名字难起的名字

 

 

(评论区里全是大佬,除我)

 

点赞0


评论


神兽喵神兽喵

好家伙

点赞0


评论


Forzen_SevenForzen_Seven

李姐李姐

点赞0


评论


星辰Lolita星辰Lolita

function point_in_ball(origin,angle,up,radius){
    return new Box3Vector3(
        origin.x + Math.cos(angle) * Math.cos(up) * radius,
        origin.y + Math.sin(up) * radius,
        origin.z + Math.sin(angle) * Math.cos(up) * radius
    )
}

白嫖了

点赞0


评论


一缕余晖一缕余晖

不错不错,但其实大家只要知道怎么用就行了,没必要知道内涵

点赞2


评论


DHS李钛钅黑DHS李钛钅黑

三角函数有必要那么难吗?

点赞0


评论


烂柯仙碁烂柯仙碁

一题三角函数诱导公式我可不困了(doge)

但是一题代码我就又困了(doge)

点赞0


评论


我就路过看看我就路过看看

哇,六年级的小伙子只看得懂前面的,编程老师上课讲过

点赞1


评论


神岛吉吉喵神岛吉吉喵

牛啊牛啊~~~支持一下

点赞2


评论


阳光猫阳光猫

牛掰imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E5%8E%89%E5%AE%B3%E4%BA%86.gif"alt="emotion_编程猫_厉害了"

点赞0


评论


小白一号Rua小白一号Rua

nbnb直接晕了

点赞2


评论


源码极客源码极客

咱就是说,四年级的费点劲勉强能看懂二维的

点赞1


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

咱就是说()这是我一个六年级的人能看的东西吗?

点赞0


评论


美男子阿宇美男子阿宇

咱就是说()这是我一个4年级的人能看的东西吗?)我也只能看懂一点())

点赞1


评论


全能代码师全能代码师

挖一挖

点赞1


评论


快乐的皮卡丘A快乐的皮卡丘A

身为捌年级的我看了之后孝了

点赞0


评论


用户_869149用户_869149

nb啊nb)

点赞0


评论


马云编程猫马云编程猫

收藏夹里见!

点赞1


评论