自动几何推理的研究(二) 线

现在研究线. 线对象被大量使用, 为此需要仔细分析.

线对象大致分两类: 线段(L_Segment), 直线(L_Line).

线段(L_Segment) 主要用于线段相等记录(Cong_Seg), 线段等比(Ratio_Seg)记录中, 也用于线段相等集合(CSegs).

线段对象本身不作为搜索数据.

直线(L_Line) 主要用于平行线(P_Line), 垂线(T_Line), 角(AngleS) 记录中. 实现中直线以路径(G_Path)为基类,

这样与圆(Circle)共用一个实现基类, 可以方便的共用路径相关的函数 (如相交,合并,增删点)等功能.

直线在逻辑上再分为只含两个点的线, 两个以上点的线(即多点共线 coll). 两个点确定一条线, 在程序中两点构成的

线主要用于表示平行线,垂线,角中需要使用线的地方. 两点线不用做搜索数据, 共线(三点及以上)才作为搜索数据.

线段和直线都在线容器中管理(存放), 容器类 L_Line_Container, 引用的变量名为 all_ln. 此名字继承自 GExpert.

在系统中, 每个线段(L_Segment)由两个点构成, 如线段 AB, CD 分别由点 A,B 和 C,D 构成. 引用线段变量时

通常使用小写字母, 如 a,b. (引用点一般用大写字母). 特别指明是线段时一般用前缀 sg. 线段 AB 和线段 BA 是

等价的, 因此系统中仅保存线段 AB, 按照 A<B 的方式存于线段中, 其中 A<B 表示 A.idx<B.idx, idx 是点的索引.

线段对象在 all_ln 中存放在数组 seg_idx[] 中. 按照 A,B 计算一个三角数得到该线段的索引. 假设系统有 N 个点,

则最多构成 N*(N-1)/2 个线段. 因此将索引放在数组中不是很大的问题. 由于数组访问非常迅速. 这样, 查找是否

存在点 A,B 构成的线段就十分高效.

只含两点的直线对象(L_Line) 类似于线段, 存放在 all_ln 容器的数组 ln_idx[] 中. 也是按照点1,点2 计算三角数

索引, 这与线段非常类似.

由于线段和两点线非常相似, 先前曾有一个实现是线段,两点线实现为一个类; 在 c# 这类静态语言中不易这么做,

但也许 javascript 动态语言就比较容易实现. 而做的动机是可以节省存储.

含三点及以上的直线对象(L_Line)也叫共线记录(collinear), 其一是这些共线以链表的形式存放(现在是双向链表),

这样可以方便的遍历所有共线; 其二是共线记录也放在 ln_idx[] 索引中, 占据每一对点形成的三角数索引位置.

举例: 设有共线 [A,B,D,E], 则此共线占据 ln_idx[] 中 (A,B), (A,D), (A,E), (B,D), (B,E), (D,E) 共六个位置.

这样取线上任意两点, 均可在 ln_idx[] 中找到此两点所在的线.

线的查找: 查找过点 A,B 的线, 先计算A,B 构成的索引 pidx, 返回 ln_idx[pidx] 值.

如果该值为空, 则表示尚未创建过 A,B 的线.

两点线的添加: 创建一个线对象(L_Line), 更新 ln_idx[] 指定位置的索引. 断言 ln_idx[] 该线位置一定没有已存在

的线对象(否则不该调用添加函数)

上两者查找+添加一般合并为 fadd_ln() 方法, 即有则返回, 没有则创建并返回.

给线添加点: 设已有直线 A,B (没有可使用上述添加算法), 在线上添加一点 C. 一般用于 ON_LINE C A B 命令,

对应几何语言: 点 C 在直线 AB 上(的实现). 创建新的线对象, 包含原有线+新的点C, 更新此新线对象到集合中.

更新算法稍后描述.

合并两条线: 设已有直线 [A,B,C], 和直线 [C,D,E], 假设某个推理推导出两直线共线(如发现 AC∥CD),

则需要合并. 创建新的线对象, 包含两条直线的所有不重复的点, 如本例合并后的线为 [A,B,C,D,E]. 更新此新线对象

到 all_ln 容器中.

线更新算法: 当产生了新的共线数据时, 要调用线(索引)更新算法. 根据数据结构设计, 新的线, 如 [A,B,C,D,E] 要占据

多个 ln_idx[] 索引位置(占据 N*(N-1)/2个索引位置, N 是点的数量). 重点是被占据的索引位置可能被别的线对象

占用了. 如 (A,B) 索引位置被直线 [A,B,C] 占用, (B,D) 索引位置可能被两点线 [B,D] 占据, 于是才有线更新的必要.

简要描述为: 尝试设置新线所有点对 (u,v) 位置的索引, 如果没有被占据, 则更新; 如果被两点线占据, 则更新, 并记录

一个标志(至少有一个线被更改); 如果被其它共线占据, 则需要递归使用合并线算法(也许不会发生??).

如果发生了至少一个线被更改的情况(标志为真), 则需要更新所有引用该线的对象, 包括平行线(P_Line), 垂线(T_Line),

角(AngleS), 这些对象的更新一般导致创建新的记录. 麻烦就麻烦在这里, 因此, 如果有空, 可以考虑减少或不更新的

可能性. 也或许可以延迟更新引用的地方(总之, 有一定复杂性).

判定 A,B,C 三点共线: 即判定 all_ln 容器中有此共线记录. 方法一: 遍历所有共线记录, 判定有一个记录同时含有

此三点; 方法二: 在 ln_idx[] 中找直线 AB, 如果没有则肯定没有共线记录, 如果有则判定该直线中含点 C 则共线;

方法三: 找直线 AB,BC, 如果是同一条线, 则共线. 此判定在系统中被(很)大量使用, 优化实现是非常值得的.

判定 A,B,C,D 四点共线: 等价于判定 A,B,C 以及 A,B,D 共线.

判定线 a,b 共线: (此a,b 可能是两点线) 首先查找 a,b 对应的共线, 如果其共线相同, 则 a,b 共线.

时间: 2024-07-28 19:11:03

自动几何推理的研究(二) 线的相关文章

(转载)Fiddler实战深入研究(二)

原文来源于:http://www.cnblogs.com/tugenhua0707/p/4637771.html,作者:涂根华 !个人觉得文章写的特别好,故收藏于此,感谢原作者的分享 Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选项卡断点调式 Fiddler 中的Stave插件 回到顶部 Fiddler不能捕获chrome的session的设置

C#创建Oracle中的几何对象:点、线、面

最初写这个程序是应老大的要求解决“更新Oracle中的空间数据时会因为wkt字符串太长而报错”这个问题,之前的更新都是在程序中插入一条SQL语句来进行更新,由于SQL语句本身的一些限制,在wkt字符串中包含几万个以上的点时就会报“ORA-01074:字符串文字太长”错误,这里提出了两种解决方法: 第一种:将之前传入简单的SQL更新语句,改为传入存储过程: DECLARE geom sdo_geometry; BEGIN geom:=sdo_geometry (2003, null, null,

NFS客户端配置为开机自动挂载报错(二)

NFS客户端配置为开机自动挂载时,系统启动报错. 报错信息类似: mount: mount: mount to NFS server '172.16.1.254' failed: mount: System Error: No route to host. 原因:网络启动后需要对网络内路由表进行"学习".在未完成路由表学习之前启动netfs服务会报错. 解决方法:延后netfs启动时间.(延时时间以实际情况为准,建议30秒) 示例: 修改:/etc/init.d/netfs脚本 在如下

C++的开源跨平台日志库glog学习研究(二)--宏的使用

上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. 日志输出宏 这里我们以一条最简单的日至输出为例说明: LOG(WARNING) << "This is a warning message"; 这里LOG是一个宏,其定义如下(logging.h line 487): #define LOG(severity) COMPACT

SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-convert.html 目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-in

智力题研究二

[IT思想类] 1. 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?(中级) 2. 共有三类药,分别重1g,2g,3g,放到若干个瓶子中,现在能确定每个瓶子中只有其中一种药,且每瓶中的药片足够多,能只称一次就知道各个瓶子中都是盛的哪类药吗? 如果有4类药呢?5类呢?N类呢(N可数)?(高级) 如果是共有m个瓶子盛着n类药呢(m,n为正整数,药的质量各不相同但各种药的质量已知)?你能只称一次就知道每瓶的药是什么吗?

NASNet学习笔记——?? 核心一:延续NAS论文的核心机制使得能够自动产生网络结构; ?? 核心二:采用resnet和Inception重复使用block结构思想; ?? 核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。

from:https://blog.csdn.net/xjz18298268521/article/details/79079008 NASNet总结 论文:<Learning Transferable Architectures for Scalable Image Recognition> 注 ??先啥都不说,看看论文的实验结果,图1和图2是NASNet与其他主流的网络在ImageNet上测试的结果的对比,图3是NASNet迁移到目标检测任务上的检测结果,从这图瞬间感觉论文的厉害之处了,值

吴恩达《深度学习》-课后测验-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-Week2 Autonomous driving (case study) (case study)( 自动驾驶 (案例研究))

Week2 Autonomous driving (case study) (case study)( 自动驾驶 (案例研究)) \1. To help you practice strategies for machine learning, in this week we'll present another scenario and ask how you would act. We think this "simulator" of working in a machine l

mysql高可用研究(二) 主从+MHA+Atlas

关于Atlas的详细介绍请访问:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md 为什么要使用Atlas?应用程序直连数据库不好吗?还要在前面加上一层代理,会不会降低应用的读写性能?会不会增加维护管理的成本?我想这是每个使用atlas之前的疑问. 1.为什么要使用Atlas? 我们使用atlas,主要使用它的读写分离和从库负载均衡功能.因为咱们这读业务远远多于写,故采用读写分离的架构再合适不过了.之前实现读写分离,一般都是通过应