从通用平面获取轴对齐坐标

2024-04-19

标题可能是错误的,因为我不知道足够的数学知识来实际用一个小句子描述我的问题。

  1. 我有一个 3D 矢量闭环,我将其称为“3D 多边形”。
  2. 我需要对其执行仅 2D 操作,这将返回一个 不同的 2D 点集
  3. 我需要将这些新的 2D 点转换回 3D。

我目前的尝试如下:

  1. 获得“最适合”的飞机,最大限度地减少制作“3D”的机会 转换为 2D 时多边形自相交。
  2. 通过移动平面法​​线得到两个垂直平面 坐标
  3. 对于每个 3D 点,获取到平面的距离以获得“轴对齐坐标”
  4. 将 Y 坐标保存在单独的变量中供以后使用,使用 X 和 Z 进行 2D 操作
  5. 执行 2D 操作
  6. 获取新的2D点,并获取最接近的3个原始点的加权平均值来假设新的2D点的高度
  7. 将“轴对齐坐标”+假定高度乘以 各自平面法线以将 2D 点返回到 3D 空间。

问题是,这不起作用,罪魁祸首似乎是我获得“轴对齐坐标”的部分,因为立即将它们恢复会给出错误的结果

    public static List<Vector2> Planify3Dto2DPoints2(Vector3[] points, Vector3 centroid, Plane ply, out Vector3[] oldHeights) {
        var pz = ply.normal.z;
        var px = ply.normal.x;
        var py = ply.normal.y;
        Plane plx = new Plane(new Vector3(pz, px, py), 0);
        Plane plz = new Plane(new Vector3(py, pz, px), 0);
        oldHeights = new Vector3[points.Length];
        List<Vector2> m_points = new List<Vector2>();
        int i = 0;
        foreach (Vector3 v3 in points) {
            Vector3 v4 = v3 - centroid;
            float x = plx.GetDistanceToPoint(v4);//this part is wrong, attempting to get the v4 
            float z = plz.GetDistanceToPoint(v4);//vector back from the x, z, y coordinates is not 
            float y = ply.GetDistanceToPoint(v4);//working. removing x * plx.Normal from v4 before
            m_points.Add(new Vector2(x, z));// extracting the z coordinate reduces the error, but does not remove it
            oldHeights[i++] = new Vector3(x, z, y);
        }
        return m_points;
    }

    public static List<Vector3> Spacefy2Dto3DPoints(Vector2[] points, Vector3 centroid, Plane ply, Vector3[] oldHeights = null) {
        List<Vector3> m_points = new List<Vector3>();
        var pn = new Vector3(ply.normal.x, ply.normal.y, ply.normal.z);
        for (int i = 0; i < points.Length; i++) {
            Vector3 mp = MoveInPlane(ply, points[i]);
            if (oldHeights != null) {
                mp += pn * oldHeights[i].z;//AverageOf3ClosestHeight(points[i], oldHeights); not needed yet, but working fine, it's weighted average
            }
            mp += centroid;
            m_points.Add(mp);
        }
        return m_points;
    }

    private static Vector3 MoveInPlane(Plane plane, Vector2 vector2) {
        var z = plane.normal.z;
        var x = plane.normal.x;
        var y = plane.normal.y;
        return new Vector3(z, x, y) * vector2.x + new Vector3(y, z, x) * vector2.y;
    }

问题就出在这一步:

  1. 通过移动平面法​​线坐标得到两个垂直平面

这不会给出垂直平面.

由于一个简单的具体示例,您可能错误地认为这会起作用,例如(1, 0, 0) => (0, 1, 0) & (0, 0, 1),或者围绕坐标的切换有效地切换了轴的角色,这相当于旋转 90 度。但尝试一下,例如(1, 1, 0)你立刻就会发现这是行不通的。

一种方法是这样的:

  • 取正常值的点积PX轴(任意选择)。
  • 如果该值接近 1 或 -1(设置一个阈值,例如abs(dot(X, P)) > 0.5),然后设置一个向量变量Q <- Z轴(同样,任意)。否则,设置Q <- X.
  • 因此,两个垂直平面的法线由下式给出U = P ^ Q and V = P ^ U。请注意,它们没有标准化,并且{U, V, P}给出一组惯用右手的 axes.

您可以进行的另一个小优化是合并- centeroid进入平面方程本身,以避免必须明确地为每个点这样做。

Vector3 Q = (Math.Abs(ply.normal.x) > 0.5) ? new Vector3D(0.0, 1.0, 0.0)
                                           : new Vector3D(1.0, 0.0, 0.0);
Vector3 U = Vector3.Normalize(Vector3.CrossProduct(ply.normal, Q));
Vector3 V = Vector3.CrossProduct(ply.normal, U);
// no need to normalize V because U and P are already orthonormal

Plane plx = new Plane(U, Vector3.DotProduct(U, centeroid));
Plane plz = new Plane(V, Vector3.DotProduct(V, centeroid));

// ...

foreach (Vector3 v3 in points) {
    /* Vector3 v4 = v3 - centroid; // erase this line */
    float x = plx.GetDistanceToPoint(v3); // v4 -> v3 for all code following
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从通用平面获取轴对齐坐标 的相关文章

  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白

随机推荐

  • Mongodb 复制主日志中的“[conn557392] Killcursors:找到 0 of 1”

    我现在正在运行 2 6 版本的生产 mongodb 复制 今天我发现主mongod实例不断写日志 conn557392 killcursors found 0 of 1 我检查了db serverStatus metrics cursor
  • 如何在javascript中旋转输入类型范围拇指?

    我有一个
  • 如何从位于另一个程序集中的BackgroundWorker 数据绑定ProgressControl?

    我有一个使用 Galasoft MVVM Toolkit 以 WPF 作为客户端的多程序集项目 我想知道如何将 ProgressControl 的 Value 属性数据绑定到 BackgroundWorker 的 ProgressChang
  • 如何获取对话框/窗口的背景颜色?

    如何获取 RGB 格式的对话框 窗口的背景颜色 Use QWidget palette访问小部件的调色板和QPalette color获取背景颜色 color widget palette color QPalette Background
  • cmake 发现错误的 python 库

    我是 CMake 新手 无法理解一些使用概念 我正在从 C 程序调用 python 脚本 include
  • 使用预加载图像以外的其他内容

    首先 我应该使用预加载图像 还是应该使用其他东西来完成我想做的事情 我开始认为预加载图像与我想要完成的任务无关 我想做的是 我想防止图像的转换效果 即您看到的闪烁 我有一个播放按钮 初始屏幕上没有图像 当您单击它时 会出现一个图像 这就是您
  • 本地主机上的服务器 App Engine Standard 无法启动

    从 eclipse 中 我创建了一个 Google App Engine 标准项目 并尝试在本地 App Engine 上运行它 它没有启动并抛出以下错误 java lang NullPointerException at java bas
  • 根据所选数字指定数字范围

    当用户选择数字 1000243 时 我想要另一个选项来从该输入的数字中选择 200 个数字 所以它会是 User Input Number Here
  • 需要用jquery将h3和div包装在包装器div中

    我有以下 HTML div class accordion h3 My title h3 div My content div h3 My title h3 div My content div h3 My title h3 div My
  • 如何从 Ionic 选项卡打开 Ionic 模态

    我有一个用例 我想通过单击 Ion 选项卡来打开 Ionic Modal 我们的应用程序有 4 个固定的ion tabs 其中一个选项卡当前转到评论表单 但它更适合作为模式 因此用户可以快速完成表单并返回到他们正在做的事情 模态框通常附加到
  • Python CSV 编写器截断长数字

    我目前正在开发一个项目 该项目需要生成一个包含大量信息的 CSV 文件作为最终输出 目前 我将所有数据存储在一个非常大的列表中 然后使用 CSV 包将其写入 CSV 文件 我的问题是其中一个数据字段包含一个非常长的数字 存储为字符串 但第
  • Swift 栈和堆的理解

    我想快速了解堆栈和堆中存储的内容 我有一个粗略的估计 您打印的所有内容和内存地址都不是值 它们存储在堆栈中 而作为值打印出来的内容则在堆上 基本上根据值和引用类型 我完全错了吗 或者 您可以提供堆栈 堆的可视化表示吗 As Juul htt
  • 如何在 Firebase 实时数据库中保存本地数据?

    我对 Kotlin 和编程非常陌生 目前正在制作包含事件的日历 当我想将这些事件连接到 firebase 时 我的问题就出现了 我正在使用在 git 中找到的一个示例 https github com kizitonwose Calenda
  • 使用鼠标滚动 DataGridView

    因此 我们都熟悉单击并按住鼠标按钮 然后将鼠标移动到网格边缘 列 行滚动并且选择范围增加的功能 我有一个基于 DataGridView 的控件 由于性能问题 我必须关闭 MultiSelect 并自行处理选择过程 现在单击 按住滚动功能也被
  • 在matlab中对矩阵元素求和的有效(最快)方法

    让我们有矩阵A say A magic 100 我见过两种计算矩阵所有元素之和的方法A sumOfA sum sum A Or sumOfA sum A 其中一个比其他更快 或更好的练习 吗 如果有的话是哪一个 或者它们都同样快 看来你无法
  • 使用 PHPMailer 附加文​​件

    我有一个 HTML 表单 可以选择上传文件 然后 我想将该文件作为附件与其余表单数据一起发送到电子邮件地址 我正在使用 PHP Mailer 我获取要发送的表单数据 例如姓名 电话号码等 我无法将图像与它一起发送 我已经提供了迄今为止的代码
  • 如何在 Android 应用程序中播放和停止 mp3 文件

    我在 eclipse 中创建了一个应用程序来播放和停止 mp3 文件 一切都很好 除了当我播放音频文件并停止它并且我想重播它时 播放 btn 不起作用 我想知道是否有人可以帮助我 提前致谢 代码如下 package ir polyglotc
  • 更改 NUnit 测试的名称

    我希望我的单元测试基于NUnit在 Visual Studio 测试资源管理器中命名的框架更易于理解 例如 而不是有Test Case 1 or TestCase1我最好有类似的东西Test Case 1 Category First Ca
  • Android Room:应用与嵌入对象相关的多列

    在我的 Android 应用程序中 我使用 Room 进行数据存储 我目前面临的问题是 我需要在嵌入对象的 Relation 中放入 2 列 因为关系依赖于 2 列 结构见下图 Entity tableName damages public
  • 从通用平面获取轴对齐坐标

    标题可能是错误的 因为我不知道足够的数学知识来实际用一个小句子描述我的问题 我有一个 3D 矢量闭环 我将其称为 3D 多边形 我需要对其执行仅 2D 操作 这将返回一个 不同的 2D 点集 我需要将这些新的 2D 点转换回 3D 我目前的