[√]数学-点乘叉乘

157 阅读2分钟

cocos creator 3.8.x 中旋转到某个角度

image.png

private _rotate(p1: Vec2/*起始点*/, p2: Vec2/*结束点*/) {
    const vec = p2.clone().subtract(p1.clone()).normalize();
    // const vec = v2(1, -1).normalize();
    const base = v2(1, 0).normalize(); // 这个(1,0)就是图片箭头的方向,比如上图里面的右箭头
    const r = base.signAngle(vec);
    this.node.angle = toDegree(r);
}

点A减点B,结果是从B点指向A点的矢量

A(1,0)- B(0,0)= (1,0)是指向点A的

Vec2::angle的返回值为[0,180]

Vec2::angle(Vec2(1,0), Vec2(1,1)); // 45°
Vec2::angle(Vec2(1,0), Vec2(1,-1)); // 45°

image.png

getAngle的返回值为[-90,90]

Vec2(1,0).getAngle(Vec2(1,1)); // 45
Vec2(1,0).getAngle(Vec2(1, -1));// -45

lua api

local angle1 = cc.pGetAngle(cc.p(1, 0), cc.p(1, 1))
local v = 180 / math.pi * angle1 -- 45

local angle2 = cc.pGetAngle(cc.p(1, 0), cc.p(1, -1))
local v = 180 / math.pi * angle2 -- -45

function cc.pGetAngle(self,other)
    local a2 = cc.pNormalize(self)
    local b2 = cc.pNormalize(other)
    local angle = math.atan2(cc.pCross(a2, b2), cc.pDot(a2, b2) )
    if math.abs(angle) < 1.192092896e-7 then
        return 0.0
    end

    return angle
end

点乘判断前后

点乘,也称为内积、数量积或标量积,是向量运算中的一种基本操作。它通常用来计算两个向量之间的相似度或角度。

几何定义: a·b=|a|*|b|*cos<a,b>

2个向量的夹角范围[0,360]

  • cos(-90°)~cos(90°) = [1,0] >0表示在前边

  • cos(90°)~cos(270°) = [0,-1] <0表示在后边

叉乘判断左右

叉乘,也称为向量积、矢量积或外积,是向量运算中的一种操作。

在计算机图形学中,叉乘可以用于计算表面法向量、生成旋转轴以及进行投影变换等操作。

几何定义:|c|=|a||b|sin<a,b>

  • sin(0°)~sin(180°) = [1,0]
  • sin(180°)~sin(360°) = [0,-1]
Vec2 vec = Vec2(0, 1)-Vec2::ZERO;
float ret = 0;
// 注意,必须是相同的起点,这个非常重要
ret = vec.cross(Vec2(0, 1)-Vec2::ZERO); // 0
ret = vec.cross(Vec2(0, -1)-Vec2::ZERO);// -0
ret = vec.cross(Vec2(1, 0)-Vec2::ZERO); // -1
ret = vec.cross(Vec2(-1, 0)-Vec2::ZERO);// 1

ret = vec.cross(Vec2(1, 1)-Vec2::ZERO);// -1
ret = vec.cross(Vec2(1, -1)-Vec2::ZERO);// -1

ret = vec.cross(Vec2(-1, 1)-Vec2::ZERO);// 1
ret = vec.cross(Vec2(-1, -1)-Vec2::ZERO);// 1

>0 左边 <0 右边