首页 > 编程语言 > 详细

[一些图形算法]

时间:2021-08-11 19:12:43      阅读:13      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!