520key 发表于 2024-4-21 00:20

ARX获取鼠标上下左右实体并且生成最小矩形

本帖最后由 520key 于 2024-4-21 11:41 编辑

请教一下大佬们,从鼠标位置往上下左右各画一条射线,在不遍历所有实体的情况下怎么能取出与这四条射线相交的最近点,并生成最小矩形,在Jig模式下又不能使用acedSSGet选择器,这个问题困扰了很久,有哪个大佬做过类似的,能不能指点一下呀?

你有种再说一遍 发表于 2024-4-21 09:04

难道你在做获取鼠标封闭区?bo算法?

520key 发表于 2024-4-21 11:41

你有种再说一遍 发表于 2024-4-21 09:04
难道你在做获取鼠标封闭区?bo算法?

是的,CAD的BO只能识别封闭的矩形,不能识别没有封闭的

你有种再说一遍 发表于 2024-4-21 19:38

本帖最后由 你有种再说一遍 于 2024-4-21 19:53 编辑

我不知道你的水平去到哪里...
1,每个扫描线和每个图元遍历时间复杂度O(m*n),这是难以接受的.你需要降到O(m*log(n))或者O(m).
2,怎么降低呢?构造有序结构,"跳过前面,末尾break",你可以清晰感觉只需要判断中间了.
3,怎么构造这个有序结构呢?有很多方法,四叉树,包围盒有序数组都可以,图元包围盒中心点y排序,然后break是不是可以横向扫描了.x排序就是竖向了.二分法四分法可以快速找到扫描线起始点和结束点.
4,批量bo概念还可以参考此处:
http://bbs.mjtd.com/thread-189551-1-1.html
5,想要速度快,无非就是开图时候并行构造索引,数据库图元加入事件上面也加一个构造,这样用户边画边构造.使用时候就是立马能够获取全图封闭区.

520key 发表于 2024-4-22 17:48

你有种再说一遍 发表于 2024-4-21 19:38
我不知道你的水平去到哪里...
1,每个扫描线和每个图元遍历时间复杂度O(m*n),这是难以接受的.你需要降到O(m ...

我还是个菜鸟水平,没能到达大佬的这种高境界,经过群里的其他大佬指点,在调用命令的时候通过多线程遍历所有对象,将所有对象按四叉树进行分割打上标记,再鼠标移动时通过鼠标点进行四叉树查找,找到鼠标一定范围内的所有对象,在鼠标位置按上下左右四个方向作4条射线,将查找到的对象与四条射线求交点,取离鼠标点最近的点组成一个矩形,大致的思路是这样的

你有种再说一遍 发表于 2024-4-22 18:02

本帖最后由 你有种再说一遍 于 2024-4-22 18:39 编辑

520key 发表于 2024-4-22 17:48
我还是个菜鸟水平,没能到达大佬的这种高境界,经过群里的其他大佬指点,在调用命令的时候通过多线程遍历 ...
既然你知道四叉树了,那么四叉树并不是好方法,我只是引入这个操作让你感受时间复杂度,上下左右射线也不是流程里面的.
先做做思维导图,然后分析时间复杂度,把流程完备.先去掌握关键一步,再去细化.
批量bo既然是批量,就是因为它肯定不是需要时候才给你准备数据,而是一开始就准备好数据,等你需要用的时候直接用.
鼠标和四叉树只是快速鼠标点在哪个封闭区里面.
那么分析全部封闭区这个才是你要掌握的.

520key 发表于 2024-4-23 13:42

你有种再说一遍 发表于 2024-4-22 18:02
既然你知道四叉树了,那么四叉树并不是好方法,我只是引入这个操作让你感受时间复杂度,上下左右射线也不是 ...

按大佬的意思是,提前将所有封闭区域都计算好,鼠标移动的时候只需要将鼠标点位置对应的矩形拿出来就可以了?

你有种再说一遍 发表于 2024-4-23 17:35

本帖最后由 你有种再说一遍 于 2024-4-23 17:39 编辑

520key 发表于 2024-4-23 13:42
按大佬的意思是,提前将所有封闭区域都计算好,鼠标移动的时候只需要将鼠标点位置对应的矩形拿出来就可以 ...
是啊,获取封闭区和取封闭区其实是两个动作.


我是从数据库原理上面获得这个操作的:插入时候维护索引顺序,而不是每次需要才排序.毕竟取是频繁的.

进而延伸,批量bo是开图一次性完成,然后不断画图时候维护.因为我们难以保存封闭区资料,所以并行重新构造速度也很快,所以不在乎开图构造那点时间.

页: [1]
查看完整版本: ARX获取鼠标上下左右实体并且生成最小矩形