设为首页收藏本站

skylineglobe技术交流社区

 找回密码
 注册
查看: 1437|回复: 0

粗略计算直线与面的交点(有误差)

[复制链接]

14

主题

14

帖子

115

积分

超级版主

Rank: 8Rank: 8

积分
115
QQ
发表于 2019-12-6 15:02:21 | 显示全部楼层 |阅读模式
本帖最后由 lichen 于 2019-12-6 15:17 编辑

在三维中计算直线与面的交点数学中已经有很多方法了,大概步骤和大概的代码如下:求得线与面的交点,需先知道直线的方向向量,有直线,那就能获得直线的两个坐标,即能获得直线的方向向量:
  1. var lineXL = {
  2.                     X: lneGeo.Points.Item(1).X - lneGeo.Points.Item(0).X,
  3.                     Y: lneGeo.Points.Item(1).Y - lneGeo.Points.Item(0).Y,
  4.                     Z: lneGeo.Points.Item(1).Z - lneGeo.Points.Item(0).Z
  5.                 }//lnegeo为直线的Geometry,
复制代码
然后需要面的法向量,法向量怎么来呢?

如上,n可以理解为面的法向量。function calculatePolygon(geometry, lneGeo) {
            if (geometry.GeometryType == 3) {
                var ox, oy, oz, x1, y1, z1, x2, y2, z2;
                //直线的方向向量
                var lineXL = {
                    X: lneGeo.Points.Item(1).X - lneGeo.Points.Item(0).X,
                    Y: lneGeo.Points.Item(1).Y - lneGeo.Points.Item(0).Y,
                    Z: lneGeo.Points.Item(1).Z - lneGeo.Points.Item(0).Z
                }
                var lineX = lneGeo.Points.Item(0).X;
                var lineY = lneGeo.Points.Item(0).Y;
                var lineZ = lneGeo.Points.Item(0).Z;
                //获取点的数量并进行判断ExteriorRing
                var count = setValue(geometry.ExteriorRing.Points.Count);
                if (count) {
                    ox = geometry.ExteriorRing.Points.Item(count[0]).X;
                    oy = geometry.ExteriorRing.Points.Item(count[0]).Y;
                    oz = geometry.ExteriorRing.Points.Item(count[0]).Z;
                    x1 = geometry.ExteriorRing.Points.Item(count[1]).X;
                    y1 = geometry.ExteriorRing.Points.Item(count[1]).Y;
                    z1 = geometry.ExteriorRing.Points.Item(count[1]).Z;
                    x2 = geometry.ExteriorRing.Points.Item(count[2]).X;
                    y2 = geometry.ExteriorRing.Points.Item(count[2]).Y;
                    z2 = geometry.ExteriorRing.Points.Item(count[2]).Z;
                    //定义两个向量,
                    var AB = {
                        X: x1 - ox,
                        Y: y1 - oy,
                        Z: z1 - oz
                    };
                    var AC = {
                        X: x2 - ox,
                        Y: y2 - oy,
                        Z: z2 - oz
                    };
                    //平面的法向量
                    var ABAC = {
                        X: AB.Y * AC.Z - AC.Y * AB.Z,
                        Y: AB.Z * AC.X - AC.Z * AC.X,
                        Z: AB.X * AC.Y - AC.X * AB.Y
                    }
                    //平面方程ABAC.X(X-OX)+ABAC.Y(Y-OY)+ABAC.Z(Z-OZ)=0
                    var t = (((ox - lineX) * ABAC.X) + ((oy - lineY) * ABAC.Y) + ((oz - lineZ) * ABAC.Z)) / ((ABAC.X * lineXL.X) + (ABAC.Y * lineXL.Y) + (ABAC.Z * lineXL.Z));
                    return {
                        X: lineX + (lineXL.X * t),
                        Y: lineY + (lineXL.Y * t),
                        Z: lineZ + (lineXL.Z * t)
                    }
                }
                else {
                    return false;
                }
            } else {
                return false;
            }

        }
        function setValue(val) {
            if (val == 3) {
                return [0, 1, 2];
            }
            else if (val > 3) {
                var p1 = Math.floor(val / 3);
                var p2 = Math.floor(val * 2 / 3);
                return [0, p1, p2];
            }
            else {
                return false;
            }
        }
  1. <span style="background-color: rgb(255, 255, 255);">最后return X,Y,Z便是最终的结果了。</span>calculatePolygon方法中 的参数分别为面的geometry对象和线的geometry对象
复制代码






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋| SkylineGlobe ( 京ICP备09046777号 )   

GMT+8, 2020-10-31 12:22 , Processed in 0.074314 second(s), 22 queries .

Powered by Skyline中国社区!

© 2013 skylineglobe.cn.

快速回复 返回顶部 返回列表