当前位置: 首页> 文旅> 艺术 > 前端工程师是干什么的_网站权重是什么_网络营销推广的手段_常用的网络营销方法及效果

前端工程师是干什么的_网站权重是什么_网络营销推广的手段_常用的网络营销方法及效果

时间:2025/7/11 14:39:51来源:https://blog.csdn.net/qq_40596257/article/details/142857868 浏览次数:0次
前端工程师是干什么的_网站权重是什么_网络营销推广的手段_常用的网络营销方法及效果

计算两点之间的距离

function calculateDistance(pointA, pointB) {// 确保输入的参数是 THREE.Vector3 类型if (!(pointA instanceof THREE.Vector3) || !(pointB instanceof THREE.Vector3)) {throw new Error('参数必须是 THREE.Vector3 类型');}// 计算两点之间的距离return pointA.distanceTo(pointB);
}// 示例使用
const pointA = new THREE.Vector3(1, 2, 3);
const pointB = new THREE.Vector3(4, 5, 6);const distance = calculateDistance(pointA, pointB);
console.log('两点之间的距离:', distance);

获取相机视线方向

function getCameraDirection(camera) {// 确保输入的参数是 THREE.Camera 类型if (!(camera instanceof THREE.Camera)) {throw new Error('参数必须是 THREE.Camera 类型');}// 创建一个向量来存储相机的方向const direction = new THREE.Vector3();// 获取相机的视线方向camera.getWorldDirection(direction);return direction;
}// 示例使用
const direction = getCameraDirection(camera);
console.log('相机视线方向:', direction);

获取相机视线方向和目标点之间的夹角

function getCameraAngleToTarget(camera, target) {// 确保输入的参数是 THREE.Camera 和 THREE.Vector3 类型if (!(camera instanceof THREE.Camera)) {throw new Error('参数 camera 必须是 THREE.Camera 类型');}if (!(target instanceof THREE.Vector3)) {throw new Error('参数 target 必须是 THREE.Vector3 类型');}// 创建一个向量来存储相机的方向const cameraDirection = new THREE.Vector3();camera.getWorldDirection(cameraDirection);  // 获取相机的视线方向// 计算从相机位置到目标点的方向向量const cameraPosition = camera.position.clone(); // 获取相机位置const targetDirection = target.clone().sub(cameraPosition).normalize(); // 目标方向// 计算相机视线方向和目标点方向的夹角const angle = cameraDirection.angleTo(targetDirection); // 返回的是弧度return angle; // 返回夹角
}// 示例使用
const target = new THREE.Vector3(10, 5, -3); // 假设目标点
const angle = getCameraAngleToTarget(camera, target);console.log('相机视线方向和目标点之间的夹角(弧度):', angle);
//如果需要将结果转换为角度,可以使用 THREE.MathUtils.radToDeg()

判断两个向量是否相等

function areVectorsEqual(vector1, vector2) {// 确保传入的是 Vector3 类型if (!(vector1 instanceof THREE.Vector3) || !(vector2 instanceof THREE.Vector3)) {throw new Error('参数必须是 THREE.Vector3 类型');}// 使用 equals() 方法判断两个向量是否相等return vector1.equals(vector2);
}// 示例使用
const vector1 = new THREE.Vector3(1, 2, 3);
const vector2 = new THREE.Vector3(1, 2, 3);
const vector3 = new THREE.Vector3(4, 5, 6);console.log('vector1 和 vector2 是否相等:', areVectorsEqual(vector1, vector2)); // true
console.log('vector1 和 vector3 是否相等:', areVectorsEqual(vector1, vector3)); // false

判断目标点是否在线段组成的折线上

function isPointOnPolyline(point, points, tolerance = 0.0001) {// 确保参数类型正确if (!(point instanceof THREE.Vector3) || !Array.isArray(points) || points.length < 2) {throw new Error('参数无效。point 必须是 THREE.Vector3,points 必须是包含至少两个 THREE.Vector3 对象的数组');}// 遍历折线的每一段(由连续两个点组成的线段)for (let i = 0; i < points.length - 1; i++) {const lineStart = points[i];const lineEnd = points[i + 1];// 计算线段向量和目标点与线段起点的向量const lineVec = lineEnd.clone().sub(lineStart); // 线段向量const pointVec = point.clone().sub(lineStart);  // 目标点与线段起点的向量// 计算点与线段的投影,判断是否共线const crossProduct = new THREE.Vector3().crossVectors(lineVec, pointVec);if (crossProduct.length() <= tolerance) {// 计算点在线段上的投影,判断是否在线段范围内const dotProduct = pointVec.dot(lineVec);const lineLengthSq = lineVec.lengthSq();if (dotProduct >= 0 && dotProduct <= lineLengthSq) {return true;  // 点在该线段上}}}return false;  // 点不在任何一段线段上
}// 示例使用
const point = new THREE.Vector3(2, 2, 0);
const points = [new THREE.Vector3(1, 1, 0),new THREE.Vector3(3, 3, 0),new THREE.Vector3(5, 5, 0)
];const isOnPolyline = isPointOnPolyline(point, points);
console.log('目标点是否在折线上:', isOnPolyline);

计算目标点在线段上的投影点

function getProjectedPointOnLine(point, lineStart, lineEnd) {// 确保输入参数是 THREE.Vector3 类型if (!(point instanceof THREE.Vector3) || !(lineStart instanceof THREE.Vector3) || !(lineEnd instanceof THREE.Vector3)) {throw new Error('参数必须是 THREE.Vector3 类型');}// 计算线段向量const lineVec = lineEnd.clone().sub(lineStart);// 计算目标点相对于线段起点的向量const pointVec = point.clone().sub(lineStart);// 计算线段的单位向量const lineVecNormalized = lineVec.clone().normalize();// 计算点在线段上的投影长度(通过点积)const projectionLength = pointVec.dot(lineVecNormalized);// 投影点 = 线段起点 + 投影长度 * 线段的单位向量const projectedPoint = lineStart.clone().add(lineVecNormalized.multiplyScalar(projectionLength));return projectedPoint;
}// 示例使用
const point = new THREE.Vector3(4, 2, 0); // 目标点
const lineStart = new THREE.Vector3(1, 1, 0); // 线段起点
const lineEnd = new THREE.Vector3(5, 5, 0);  // 线段终点const projectedPoint = getProjectedPointOnLine(point, lineStart, lineEnd);
console.log('投影点坐标:', projectedPoint);

持续记录~

关键字:前端工程师是干什么的_网站权重是什么_网络营销推广的手段_常用的网络营销方法及效果

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: