【JavaScript&&Threejs】判断路径在二维平面上投影的方向顺逆时针

这篇具有很好参考价值的文章主要介绍了【JavaScript&&Threejs】判断路径在二维平面上投影的方向顺逆时针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理分析

可以将路径每个连续的两点向量叉乘相加,根据正负性判断路径顺逆时针性
当我们计算两个向量的叉积时,结果是一个新的向量,其方向垂直于这两个向量所在的平面,并且其大小与这两个向量构成的平行四边形的面积成正比。这个新向量的方向由右手定则确定:如果你将右手的四指放在两个向量的方向上,让拇指指向叉积的方向,那么你的手指弯曲的方向就是两个向量的顺时针旋转方向。

当我们应用这个概念到路径的情况时,我们可以将相邻的路径点表示为向量,然后计算它们之间的叉积。这个叉积的 z 分量(如果我们将路径投影到 xy 平面上)可以告诉我们这两个向量之间的顺时针或逆时针关系。
【JavaScript&&Threejs】判断路径在二维平面上投影的方向顺逆时针,theejs实战,Javascript,javascript,平面,开发语言
由于threejs很多地方对凹凸多边形没有限制,可以在输入端限制凹三角或在计算中舍弃凹点文章来源地址https://www.toymoban.com/news/detail-858733.html

代码

import { Vector3 } from "three";

/**
 * 判断向量是否为顺时针  返回值true逆时针  false 顺时针
 * @param {[Vector3]} path //vec3路径
 * @param {'x'|'y'|'z'} forword //基准
 * @returns 
 */
export default function isClockwise(path, forword = 'z') {
    let sum = 0;
    const n = path.length;

    for (let i = 0; i < n; i++) {
        const current = path[i];
        const next = path[(i + 1) % n]; // 取下一个点,循环到第一个点

        // 计算当前点到下一个点的向量
        const vector = next.clone().sub(current);

        // 只考虑 xy 平面上的向量,忽略 z 分量
        vector.z = 0;

        // 叉积的 z 分量可以判断顺时针还是逆时针
        if (forword == 'z')
            sum += (current.x * next.y - next.x * current.y);
        else if (forword == 'x')
            sum += (current.z * next.y - next.z * current.y);
        else if (forword == 'y')
            sum += (current.x * next.z - next.x * current.z);
	
		/**
		*如果业务需要 可以在这里判断sum大小变化确定 如果增或者减反向 则可判断这里出现凹点
		*/
    }

    // 如果 sum 大于 0,则路径是逆时针的;如果 sum 小于 0,则路径是顺时针的
    return sum > 0;
}

使用

使用isClick判断路径方向性,并转为顺时针
   let reverse = isClockwise(vertices)
    if (reverse) vertices.reverse()

到了这里,关于【JavaScript&&Threejs】判断路径在二维平面上投影的方向顺逆时针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用python计算两个平面相交直线的方向向量

    利用两平面的法向量做”叉乘“运算获得两平面交线的方向向量。 如图所示,两平面相交关系为: 图中 n 1 ⃗ vec{n_1} n 1 ​ ​ 为平面1的法向量, n 2 ⃗ vec{n_2} n 2 ​ ​ 为平面2的法向量, l ⃗ vec{l} l 为两平面交线的方向向量。根据丘维声所著《解析几何(第三版)》第3

    2024年02月05日
    浏览(30)
  • 3d世界坐标转换到某个二维平面。

    有个功能需要截取某个平面的点云数据,然后计算宽高。需要将3d点投影到二维平面上。

    2024年04月26日
    浏览(34)
  • 2d平面unity,鼠标点击某个位置,人物角色朝这个方向移动

    2d平面unity,鼠标点击某个位置,人物角色朝这个方向移动 如果我们没有将鼠标点击位置转换为世界坐标系中的位置,而是直接将屏幕坐标系中的位置作为角色移动的目标位置,那么可能会发生以下两种情况: 角色会偏离目标位置 由于屏幕坐标系中的位置和世界坐标系中的位

    2024年02月06日
    浏览(67)
  • Unity二维平面上物体的移动(三)

    在上一篇中使物体来回移动的函数主要是获取键盘操作输入的情况Input.GetKey(),然后物体朝着某一个方向移动gameObject.transform.Translate(Vector3.up*Time.deltaTime); 除了这个函数,可以用开发环境自带设置,Input.GetAxis(),然后使物体移动; 新建一个文件,命名为MovementOther.cs using Sys

    2024年02月08日
    浏览(25)
  • 重积分 | 第二类曲面积分投影法正负判断

    1,如果题目中要求的是外侧或者内侧 曲面是一张纸,假设外侧为白色,内侧为黑色 当选择外侧(白色)时,法向量与z正向为锐角 内侧(黑色)时,法向量与z正向为钝角 现假设曲面在桌子上方(z>0) 投影就是把纸平铺在桌子上 可以发现,不管你在曲面的时候选择内侧还

    2024年02月04日
    浏览(26)
  • 二维体光子晶体的平面波展开法代码

    蓝色小圆是FEM绘制的能带。我原先按照自己的理解改动了下上面的代码,但是和FEM的结果符合得没上面的代码好。 抄的书上的代码: Photonic Crystals Physics and Practical Modeling (Igor A. Sukhoivanov, Igor V. Guryev (auth.)) 下面是相同参数,但按照我自己的理解改了一点点的代码,结果和FEM的

    2024年02月10日
    浏览(31)
  • 判断平面中两射线是否相交的高效方法

    最近在工作中遇到判断平面内两射线是否相交的问题。 对于这个问题的解决,常规的方法是将两条射线拓展为直线,计算直线的交点,而后判断交点是否在射线上。 这种方法,在思路上较为直观,也易于理解。然后,该方法在计算量上相对较大。对于少量射线间的交点计算

    2024年02月12日
    浏览(38)
  • 【Lidar】基于Python的三维点云数据转二维平面+散点图绘制

            最近一直在搞点云相关的操作,有时候在处理点云数据时需要查看处理后的数据是否满足需求,所以就想着写一套展示点云的代码。之前已经分享过如何可视化点云了,感兴趣的可以自己去看下:【Lidar】基于Python的Open3D库可视化点云数据。但是这个是3维展示,不满

    2024年02月21日
    浏览(36)
  • Android 获取屏幕方向,根据屏幕旋转角度判断屏幕实际方向

    在使用 getResources().getConfiguration().orientation 获取屏幕方向时,可能会遇到不准确的问题。 这是因为该方法返回的是设备的自然方向,而不是屏幕的实际方向。 在某些情况下,设备的自然方向可能与屏幕的实际方向不同。例如,如果设备是横向放置的,但屏幕是纵向显示的,那

    2024年02月03日
    浏览(41)
  • python 如何判断点是否在多边形(三角形)内,或求点在3D面上的投影?

    方法1: 用shapely中的geometry包 1)polygon.covers(point) 如果point在多边形polygon上(包括边),返回True,否则False。 2)polygon.contains(point) 如果point在多边形polygon上(不包括边),返回True,否则False。 方法2: 用blender的内置python api。 将点投影到三角形平面上,并检查其是否在三角形

    2023年04月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包