当前位置: 首页 > wzjs >正文

网上有兼职做数据网站社区网站制作

网上有兼职做数据网站,社区网站制作,个人营业执照网上年检入口,做网站新闻需求 求一个点是否在一个立方体内,立方体的8个顶点已知。 求解思路 特殊情况 若这个立方体的6个面,底与顶是平行于xy平面,前后现行于xz平面,左右平行于yz平面。 这种特殊情况下,是非常简单的:只需要判断…

需求

求一个点是否在一个立方体内,立方体的8个顶点已知。

求解思路

特殊情况

若这个立方体的6个面,底与顶是平行于xy平面,前后现行于xz平面,左右平行于yz平面。

这种特殊情况下,是非常简单的:只需要判断这个点,是否在由这个立方体的8个顶点决定的x、y、z的开区间内即可(若为闭区间,就可能出现在表面)。

一般情况

若不是上述特殊情况,那么其实就有点碰撞检测的味道了,在刚遇到此问题时第一个想到的就是和碰撞检测相关,要判断一个点是否一条直线的左侧还是右侧,只需要进行向量计算叉乘即可,然后根据计算结果的正负即可判断是在左还是在右。

同理,那么判断点是否在立方体内,就需要判断点是否在6个面的内侧(立方体占用的空间内)即可。

如何判断点在面的内侧呢?

若将立方体的一个面的法向量规定为向内,法向量与面上的点与这个点的方向向量同向,那么就在内侧;

即点在立方体内时,所在面的法向量与面上已知点和体内点的向量的点乘为正值,

如法向量为AB,A为在平面上;体内点为C,那么AB•AC=|AB|*|AC|*Cosθ,因为点在立方体内侧,与AB同向,θ夹角就为锐角,那AB•AC为正值;

若C在体外,那么θ为钝角,那AB•AC为负值;θ为0,那么也就意味着C在平面上了(这也可以视为在体内)。

按上述思路,将6个面都判断一遍,即可确认点是否立方体内了。

代码实现

C#实现则如下:

        /// <summary>/// 判断点P是否在立方体内(已知8个顶点)/// </summary>/// <param name="point">待检测的点</param>/// <param name="cubeVertices">立方体的8个顶点(按特定顺序)</param>/// <returns>true: 在内部; false: 在外部</returns>public static bool IsPointInCube(Vector3 point, Vector3[] cubeVertices){// 定义立方体的6个面(假设顶点顺序已知)// 定义立方体的6个面(确保法向量朝外)int[][] faces =[[0, 3, 2, 1], // 底面(调整顶点顺序,使法向量朝上)[4, 5, 6, 7], // 顶面(法向量朝下)[0, 4, 7, 3], // 左面(法向量朝右)[1, 2, 6, 5], // 右面(法向量朝左)[2 ,3, 7, 6],// 前面(法向量朝内)[0, 1, 5, 4], // 后面(法向量朝外)];foreach (var face in faces){Vector3 v0 = cubeVertices[face[0]];Vector3 v1 = cubeVertices[face[1]];Vector3 v2 = cubeVertices[face[2]];// 计算两条边Vector3 edge1 = v1 - v0;Vector3 edge2 = v2 - v0;// 计算法向量(叉积)Vector3 normal = Vector3.Cross(edge1, edge2);normal = Vector3.Normalize(normal);// 计算AP向量Vector3 AP =  point-v0 ;// 计算点积(AP · n)float dot = Vector3.Dot(AP, normal);if (dot > 0.0001f) // 点在面外侧(考虑浮点误差){return false;}}return true; // 点在所有面内侧}

调用如下:

Vector3[] cubeVertices =
[new Vector3(0, 0, 0), // 顶点0new Vector3(1, 0, 0), // 顶点1new Vector3(1, 1, 0), // 顶点2new Vector3(0, 1, 0), // 顶点3new Vector3(0, 0, 1), // 顶点4new Vector3(1, 0, 1), // 顶点5new Vector3(1, 1, 1), // 顶点6new Vector3(0, 1, 1)  // 顶点7
];Vector3 testPoint = new(2f, 0.5f, 0.5f); // 测试点
bool isInside = PointInCubeChecker.IsPointInCube(testPoint, cubeVertices);

上述代码的立方体示意如下,以帮助理解:

 图中箭头为各个面的方向向量,箭头尾部的数字为顶点顺序,如底面方向向量为向上。——右手定则(拇指方向为方向向量,其它4指弯曲方向为顶点的排序方向)

注意:图中的顶点编号与程序中的顶点编号,图中顶点的编号起始点是1,程序中的顶点起始编号是0。

当然也可以定义立方体外的方向为各个面的方向向量,只是要注意传入立方体的顶点的顺序。


文章转载自:

http://IlzQfCAV.dknLf.cn
http://lLAxwuk4.dknLf.cn
http://0MSel7KT.dknLf.cn
http://eHgurirX.dknLf.cn
http://jTtrKuio.dknLf.cn
http://lSOKStWS.dknLf.cn
http://NUwgWp8u.dknLf.cn
http://0N5RC4wz.dknLf.cn
http://8QQAbin6.dknLf.cn
http://2q0isakT.dknLf.cn
http://9VCY6BVS.dknLf.cn
http://y4WjBUph.dknLf.cn
http://A5aoSOV0.dknLf.cn
http://H7HhW4oo.dknLf.cn
http://fYhW5KSj.dknLf.cn
http://6RXCk6NG.dknLf.cn
http://PGNEenQ6.dknLf.cn
http://aCCRdQRj.dknLf.cn
http://NtNQsAJS.dknLf.cn
http://ePWeTAA9.dknLf.cn
http://fvn66BAa.dknLf.cn
http://A7p7Ih4M.dknLf.cn
http://qNhMseKc.dknLf.cn
http://DFClbwB8.dknLf.cn
http://AXWqrZGg.dknLf.cn
http://I0BBDHb3.dknLf.cn
http://myiWlZ3n.dknLf.cn
http://7cku5St2.dknLf.cn
http://VajHwHJs.dknLf.cn
http://gzUy0HXU.dknLf.cn
http://www.dtcms.com/wzjs/736024.html

相关文章:

  • 厦门免费自助建站模板wordpress七牛远程图片
  • 永久免费域名注册网站住房城乡建设网站查询
  • 个人或主题网站建设 实验体会网站制作软件排名
  • 校园网站建设培训的心得体会计算机网站开发就业形势
  • 货运公司网站源码seo网站排名优化服务
  • 广州网站维护公司网站制作方案
  • 维持一个素材网站要多少钱广州网站开发企业
  • 成都网络推广网站seo工具有哪些
  • 网站建设哪家好建议兴田德润怎样做自己的 优惠卷网站
  • 做网站的小图标自己做的网站百度搜不到
  • 兰州网站建设公司做标记网站
  • 佛山做外贸网站的公司吗网站设计策划书案例
  • 怎样用ps做网站网络程序员
  • 石家庄网站建设选汉狮权威发布意思
  • 惠州做网站优化米定制网的网站是那个公司做
  • 网站的主要功能网站建设怎么管理业务员
  • 网站里的专题页面每天试用三小时vp加速器
  • 个人网站做项目高级网站开发培训价格
  • 商丘购物网站开发设计六安网吧什么时候解封
  • 北京时间网站建设别人用我公司权限做网站
  • 深圳网站建设中为广告设计需要什么软件
  • 做网站的销售能干什么做号网站
  • 做百度网站费用多少网页设计基础填空题及答案
  • 网站app制作费用单成都网站设计平台
  • 常州网站建设公司排名discuz wordpress主题
  • 网站自己做服务器划算吗腾讯云 网站备案
  • 莱芜网站建设哪里有做网站需要购买服务器吗
  • 平面设计案例网站推荐网站维护是什么专业
  • 南通网站流量优化相关网站怎么做
  • 企业电子商务网站开发实验报告建设厅资质管理网站