1.向量的点乘运算
1 public static dot(_pointA:Point, _pointB:Point):number 2 { 3 var b:number = ((_pointA.x * _pointB.x)) + ((_pointA.y * _pointB.y)); 4 return b; 5 }
/** * 点乘 * @param vec1 * @param vec2 */ public static dotProduct(vec1:Vector3D, vec2:Vector3D):number { return ((((vec1.x * vec2.x)) + ((vec1.y * vec2.y)))) + ((vec1.z * vec2.z)); }
2.计算一个2d对象的叉乘
1 public static crossProduct(a:Point, b:Point):number 2 { 3 return ((a.x * b.y)) - ((a.y * b.x)); 4 }
/** 3d叉乘(结合行列式记忆)
|i j k|
|ax ay az|
|bx by bz|
* vec1 叉乘vec2
* @param vec1 叉乘左因子
* @param vec2 叉乘右因子
*/
public static crossProduct(vec1:Vector3D, vec2:Vector3D, result:Vector3D = null):Vector3D { if (result == null) { result = new Vector3D(); } var x1:number = vec1.x; var y1:number = vec1.y; var z1:number = vec1.z; var x2:number = vec2.x; var y2:number = vec2.y; var z2:number = vec2.z; result.x = (((y1 * z2)) - ((z1 * y2))) ; result.y = (((z1 * x2)) - ((x1 * z2))) ; result.z = (((x1 * y2)) - ((y1 * x2))) ; return result; }
3.计算3个点之间的叉乘
/** *计算3个点之间的叉乘,midpoint为中心点 ,如图求出来的值一定大于0(a顺时针旋转到b,小于180度,值大于0,大于180度,小于0), * * /|\ a * | * | * | * | b * |__________________ * midPoint / * * @param midpoint 中心点 * @param a 同坐标系中的一个点 * @param b 同坐标系中的一个点 * @return 返回Z的高度,也就是叉乘后的值(这个值的绝对值等于这两个向量构成的平行四边形的面积),同时等于这个3个点构成的 * 三角面的面积的两倍 * */ public static crossProductMidPoint(midPoint:Point, a:Point, b:Point):number { return ((((a.x - midPoint.x)) * ((midPoint.y - b.y)))) - ((((a.y - midPoint.y)) * ((midPoint.x - b.x)))); }
4.
/** *计算一个向量的旋转 * @param point 向量 * @param rotate 旋转值,以弧度为单位 * @return 返回旋转后的向量 * |cos -sin||x|
|sin cos||y| */ public static pointRotateAngle(point:Point, rotate:number):Point { var newPoint:Point = new Point(); var sin:number = Math.sin(rotate); var cos:number = Math.cos(rotate); newPoint.x = (((point.x * cos)) - ((point.y * sin))) ;//结合上面的行列式记忆 newPoint.y = (((point.x * sin)) + ((point.y * cos))) ; return newPoint; }
5.
/** * 计算一个点A绕着另一个点B的旋转 * @param point 点 * @param rotatePoint 旋转中心 * @param rotate 旋转值单位 角度 * @return 旋转后点A的新坐标; * */ public static pointRoundRotate(point:Point, rotatePoint:Point, rotate:number):Point { var newPoint:Point = new Point(); var sin:number = Math.sin(rotate); var cos:number = Math.cos(rotate); newPoint.x = (point.x - rotatePoint.x) ;//计算:中心点rp指向要旋转点p的向量 newPoint.y = (point.y - rotatePoint.y) ;//计算:中心点rp指向要旋转点p的向量
newPoint = Math2D.pointRotate(newPoint, rotate);
newPoint.x = (newPoint.x + rotatePoint.x) ;
newPoint.y = (newPoint.y + rotatePoint.y) ;
return newPoint;
}
6.
/** *计算三个点构成的三角形的面积的两倍 * @param a 第一个顶点 * @param b 第二个顶点 * @param c 第三个顶点 * @return 返回三角形的有符号面积 * */ public static triangleVertexArea2(a:Point, b:Point, c:Point):number { return ((((a.y - c.y)) * ((b.x - c.x)))) + ((((b.y - c.y)) * ((c.x - a.x)))); }
7.
/** *计算任意多边形的有符号面积,面积可能是负的 * @param data 构成多边形的点 * @return 返回有符号的面积 */ public static polygonVertexArea(data:Point[]):number { if (data.length == 0) { return 0; } var i:number = 0; var len:number = (data.length - 1); var addI:number = 0; var sum:number = 0; for(i = 0; i < len; i++) { addI = ((i + 1)); sum = (sum + (((data[(addI)].y + data[(i)].y)) * ((data[(addI)].x - data[(i)].x)))); } sum = (sum + (((data[0].y + data[(len)].y)) * ((data[0].x - data[(len)].x)))); return sum * 0.5; }
8.
原文:https://www.cnblogs.com/buerjiongjiong/p/15129261.html