java 平面向量_【JS图形学基础】平面向量的计算和运用实例

本文介绍了平面向量的基本概念,包括有向线段、模、零向量、相等向量和平行向量。此外,还讲解了单位向量、相反向量的定义。在几何表示部分,阐述了二维和三维向量的坐标表示,并详细说明了向量的相加、点乘和叉乘的计算方法。最后,通过实例展示了如何在JavaScript中进行向量叉乘运算,并提供了判断线段相交及点在多边形内的方法。
摘要由CSDN通过智能技术生成

平面向量的计算和运用实例

相关概念

有向线段:具有方向的线段叫做有向线段,以A为起点,B为终点的有向线段记作 或AB;

向量的模:有向线段AB的长度叫做向量的模,记作|AB|;

零向量:长度等于0的向量叫做零向量,记作 或0。(注意粗体格式,实数“0”和向量“0”是有区别的,书写时要在向量“0”上加箭头,以免混淆);

相等向量:长度相等且方向相同的向量叫做相等向量;

平行向量(共线向量):两个方向相同或相反的非零向量叫做平行向量或共线向量,-零向量与任意向量平行,即0//a;

单位向量:模等于1个单位长度的向量叫做单位向量,通常用e表示,平行于坐标轴的单位向量习惯上分别用i、j表示。

相反向量:与a长度相等,方向相反的向量,叫做a的相反向量,-(-a)=a,零向量的相反向量仍然是零向量。 [1]

几何表示

2924a720438c605152e0123912051bb6.png

二维

任取平面上两点A(x1,y1),B(x2,y2),则向量AB=(x2-x1,y2-y1),即一个向量的坐标等于表示此向量的有向线段的终点坐标减去始点的坐标。

三维

A(x1,y1,z1),B(x2,y2,z2),向量AB=(x2-x1,y2-y1,z2-z1)

基本计算

向量相加

二维

平行四边形定则解决向量加法的方法:将两个向量平移至公共起点,以向量的两条边作平行四边形,向量的加法结果为公共起点的对角线。

8fbb54ad125fc0c3ef15ac04de3db44c.png

向量的点乘:a * b

公式:a b = |a| |b| * cosθ

点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。

点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。

向量的叉乘:a ∧ b

方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。

右手定则:右手的四指方向指向第一个矢量,屈向叉乘矢量的夹角方向(两个矢量夹角方向取小于180°的方向),那么此时大拇指方向就是叉乘所得的新的矢量的方向.(大拇指应与食指成九十度)

在二维中,两个向量的向量积的模的绝对值等于由这两天向量组成的平行四边形的面积

011d2bb6bbcafada3b8e22505a713294.png

二维

(x1,y1)X(x2,y2)=(x1y2-x2y1)

三维

(x1,y1,z1)X(x2,y2,z2)=(y1z2-y2z1, z1x2-z2y1, x1y2-x2y1)

实例运用

//计算向量叉乘

var crossMul=function(v1,v2){

return v1.x*v2.y-v1.y*v2.x;

}

//javascript判断两条线段是否相交

var checkCross=function(p1,p2,p3,p4){

var v1={x:p1.x-p3.x,y:p1.y-p3.y};

v2={x:p2.x-p3.x,y:p2.y-p3.y};

v3={x:p4.x-p3.x,y:p4.y-p3.y};

v=crossMul(v1,v3)*crossMul(v2,v3);

v1={x:p3.x-p1.x,y:p3.y-p1.y};

v2={x:p4.x-p1.x,y:p4.y-p1.y};

v3={x:p2.x-p1.x,y:p2.y-p1.y};

return (v<=0&&crossMul(v1,v3)*crossMul(v2,v3)<=0)?true:false;

}

//判断点是否在多边形内

var checkPP=function(point,polygon){

var p1,p2,p3,p4;

p1=point;

p2={x:-100,y:point.y};

var count=0;

//对每条边都和射线作对比

for(var i=0;i

p3=polygon[i];

p4=polygon[i+1];

if(checkCross(p1,p2,p3,p4)==true){

count++;

}

}

p3=polygon[polygon.length-1];

p4=polygon[0];

if(checkCross(p1,p2,p3,p4)==true){

count++;

}

// console.log(count)

return (count%2==0)?false:true;

}

/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值