平面扫描算法:如何对交点之后的线段进行排序

2023-12-30

我正在尝试根据这本书在 C++ 代码中实现线段相交的平面扫描算法:http://www.cs.uu.nl/geobook/ http://www.cs.uu.nl/geobook/。他们建议使用平衡二叉搜索树来实现平面扫描的状态结构。

我正在使用 std::set 结构来实现状态结构,但在重新排序包含点“p”且其上端点是点“p”的段时遇到问题。它们具有相同的坐标点,这意味着我无法将它们插入到 std::set 中,因为它不允许重复的值...我尝试用它们的下端点插入它们,但是随后,它们将丢失其中的顺序它们与“p”下方的扫描线相交。

书中的伪代码如下:

  1. 将 U(p) ∪C(p) 中的线段插入到 Tai 中。道中线段的顺序应与它们相交的顺序相对应 p 下方的扫描线。如果有水平线段,它就会出现 所有包含 p 的段中的最后一个。
  2. (* 删除并重新插入 C(p) 的段会颠倒它们的顺序。*)

我不知道它们将如何反转顺序。当我在状态结构中插入段时,我将按它们的 x 上端点坐标对它们进行排序。我不知道在交叉路口后如何交换他们的顺序。

任何想法?

更新:这本书在这里:https://books.google.com/books?id=C8zaAWuOIOcC https://books.google.com/books?id=C8zaAWuOIOcC但有一些页面没有出现。它位于第 2 章第 24、25 和 26 页。希望它有助于提供一些背景信息

Best,


使用时std::set两个或多个项目的外观共同 y 值应该不是问题,假设您使用合适的比较器std::set。我建议,除了 y 值之外,按斜率比较和排序。 (比较器的示例std::set https://stackoverflow.com/questions/2620862/using-custom-stdset-comparator)

I would suggest not to use std::set for it but something like std::vector. Using std::vector enables you to swap (std::swap) the references to certain line segments and also insert/remove in O(log n) time if a line segment starts/ends, where n is the number of line segments. The idea is that you maintain the correct order of the status yourself throughout the line sweep by swapping the line segments that correspond to an intersection, only the event queue is a priority queue. (Removed due to the comment of @Sneftel, thanks for the insight.)

关于扫描线算法的一般方法: 状态(sweep line status) 确实代表线扫描中特定(当前)时间的线段顺序。对于扫描线状态,根据我的理解,应该使用平衡二叉树(如@Sneftel所述)。然后,您可以通过交换与交点对应的线段,在整个线扫描过程中自己保持状态的正确顺序,仅event queue必须是某种优先级队列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平面扫描算法:如何对交点之后的线段进行排序 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • C++:友元声明‘声明非模板函数

    我遇到了超载问题 lt lt 流运算符 我找不到解决方案 template
  • Keras - model.evaluate() 和 model.predict() 之间有什么区别

    我有两个问题 1 model evaluate 和 model predict 有什么区别 2 Keras 如何计算其中每一项 model evaluate预测值并计算给定数据集上模型的损失和所有附加指标 它返回一个列表 其中包含一个值中的
  • File.ReadLines 没有锁定吗?

    我可以用以下命令打开 FileStream new FileStream logfileName FileMode Open FileAccess Read FileShare ReadWrite 无需锁定文件 我可以做同样的事情File
  • 注意:使用未定义的常量 ENT_HTML5 - 假定为“ENT_HTML5”

    我正在尝试创建一个接受 htmlspecialchars 参数的简单方法 虽然我收到 PHP 通知 使用未定义的常量 ENT HTML5 假定为 ENT HTML5 有什么想法可能导致这种情况吗 Encode string param ar
  • 乘客问题 - Apache

    在 Ubuntu 10 04 LTS 的 Linode 切片中运行 我收到 500 内部服务器错误 Apache 日志有 Apache 2 2 14 Ubuntu Phusion Passenger 2 2 7 配置 恢复正常操作 捕获 S
  • Django 返回带有 L 的用户模型 ID

    这个问题直到现在才出现 这里是 当我尝试从用户模型获取用户 ID 时 它返回用户 ID 和字母 L gt gt gt from django contrib auth models import User gt gt gt u User o
  • Java:如果我的程序有一个实例正在运行,我如何检测它,然后关闭旧的实例

    我只想运行我的程序的一个实例 但我希望它能关闭旧的 如果它们打开的话 这是在Java中 如果应用程序是使用启动的Java网络启动 http www java com en download faq java webstart xml它可以访
  • 我可以以编程方式列出 Images.xcassets/Something 中的文件吗?

    是否可以列出 Images xcassets Something 中的所有图像 以便我可以在表格列表视图中显示它们 我试过了 NSArray pngs NSBundle pathsForResourcesOfType png inDirec
  • 如何使用 DropZone.js 获得更高质量的缩略图?

    我正在使用 DropZone 将文件上传到我的服务器 默认设置就可以了 但是照片有点小 我决定进入 dropzone css 文件并将默认参数更改为 250px x 250 px 而不是 100px x 100px dropzone pre
  • spring-data-redis Jackson 序列化

    我正在尝试使用 spring data redis 的 Jackson 序列化功能 我正在构建一个 ObjectMapper 并使用 GenericJackson2JsonRedisSerializer 作为 redisTemplate 的
  • 短变量声明和“声明变量但未使用”错误

    我偶然发现了一个奇怪的问题 以下代码无法编译 func main var val reflect Value var tm time Time if tm err time Parse time RFC3339 2018 09 11T17
  • 使用netty高速发送消息时出现OOM异常

    我用netty编写了一个客户端 以便以高速率发送消息 通过 jConsole 我看到 老一代 正在增加 最后它抛出 java lang OutOfMemoryError 超出 GC 开销限制 是否有一些方法或配置可以避免此异常 以下是我的测
  • 管理每周时间表的数据库架构

    我写这篇文章是因为我想知道是否有人可以帮助我找出简单时间表应用程序的最佳数据库架构 我不知道如何绘制表格来帮助我代表一年中的几周 所有用户都将在其中记录他们每周的工作时间 干杯 非常感谢您的帮助 吉列尔莫 我将与您分享我们使用的一个典型模型
  • Scala 元组的通用“映射”函数?

    我想使用返回类型 R 的单个函数来映射 Scala 元组 或三元组 的元素 结果应该是具有 R 类型元素的元组 或三元组 好的 如果元组的元素来自相同类型 则映射不是问题 scala gt implicit def t2mapper A t
  • 灰度图像中像素的质心

    我正在开发一个程序 让用户在 涂鸦区域 绘制一个数字 按下按钮 应用程序将使用神经网络分类器预测他输入的数字 现在 为了训练神经网络 我使用了 MNIST 数据库 其中指定了以下内容 NIST 中的图像经过尺寸标准化以适合 20x20 像素
  • 使用 Fetch API 时捕获“无法加载资源”

    我试图在使用 Fetch API 时捕获一堆与同源策略相关的错误 但没有成功 window onerror message file line col error gt console log error window addEventLi
  • Excel VBA 登录 IE 站点

    我是一名 VBA 新手 也是 Stack Overflow 的新手 尽管我已经阅读这里的帖子有一段时间了 我已经搜索了很多编码问题的答案 但似乎找不到答案 我正在尝试登录网站 导航到页面 然后从该页面抓取数据 我已经开始构建我从互联网上找到
  • Haskell:标准库是否假设 Eq 和 Ord 兼容?

    这是一个后续问题Eq 和 Ord 实例不一致 https stackoverflow com questions 17114899 inconsistent eq and ord instances 本质上的问题是 当声明时Eq and O
  • Rails3 和 Sass::Plugin::options

    当我尝试添加时Sass Plugin options style compact到环境 rb 当我尝试启动我的服务器时 我得到 未初始化的常量 Sass NameError 我已经添加了gem haml 3 0 0 to my Gemfil
  • 平面扫描算法:如何对交点之后的线段进行排序

    我正在尝试根据这本书在 C 代码中实现线段相交的平面扫描算法 http www cs uu nl geobook http www cs uu nl geobook 他们建议使用平衡二叉搜索树来实现平面扫描的状态结构 我正在使用 std s