根据顺时针方向排列点

2 March 2024

 

电脑看到图形并不是人眼的样子,当我们无论从以何种方式获得一堆点的时候,点的顺序是杂乱无章的,有时候面对这些点的集合,我们需要重新按一定顺序排列,比如说顺时针或者逆时针的方式排列。

 

有人会问,为什么需要排列点,以下列举一种情况,比如说在我频道里观看比较多的一个视频是如何从cad里创建墙体,那个自动化脚本使用的墙体是比较简单的,如果墙体的构造添加了保温层等,这时候用那个脚本建立的墙体就可能出现有的墙体保温层在内,而有的保温层在外的情况。

 

如果按一定方向排列好后,这时候创建的墙体方向就都是一致的。

 

出现这样的原因当然是因为线段是有原因的,在使用AutoCAD的时候我们可能碰到两条线无法倒角的情况,也就是那个快捷键F的命令,这时候需要对多段线进行反转方向,然后才能完成倒角命令。

 

线的方向和向量不完全一致,这里所说的线的方向是一端是起点,我们可以理解成0,另一端终点我们可以理解为1,这条线可以是直线,也可以是圆弧,多段线,或者曲线。

 

而向量是从一个点到另一个点的方向,是明确的,简单说就是有方向,单位长度为1的直线。

 

当我们理解了线的方向,从简单的开始说,中点都是0.5,无论从哪边算起。

 

线的起点是0,终点是1,比如0.3在哪里呢,0.3也就是30%长度断开时,这个位置所在点,如果将这条线反转则应该是0.7的位置。

 

以此延伸,我们比如都想获得线的0.2位置的点,但是未必都是我们想要获得的位置,可能有的0.2,其实在我们看来是0.8的位置。

 

所以按一定顺序,比如顺时针排列好,则可以实现我们想要的效果。

 

那么如何排列呢?

 

首先,我们可以通过所有已知点的位置,通过他们在平面中的位置,获得每个点的坐标x和坐标y,取平均数,然后形成一个中点。

 

使用这个中点,我们可以把它往右偏移一个单位,获得一条用于测量角度的辅助水平线。

 

最后将每个点和这个中点的连成的直线,和我们刚才创建的辅助水平线,其实也就是通过这个点的x方向的向量。

 

我们就可以得到一个角度。判断这些角度的大小就可以知道这些点的方位。

 

根据这些角度的大小按从小到大排列这些点,我们可以获得按照顺时针或者逆时针排列的点了。

 

注意,此方法只适用于凸多边形,对于有凹多边形是无效的,具体可以参考网上这个帖子的内容,因为凹多边形的交点和中点形成的角度,即便是从顺时针排列,并不是从小到大的顺序,可能出现较小的角度其实是属于后面的点。

 

这个帖子也写了,对于凹多边形来说,点形成的形状可能不止一种,所以其实不止一种顺序,所以这种方法是有适用情形的。

 

不过对于上面讲到的,外墙有保温层构造,而且是凸多边形的情况下,通过排列好的点,重新创建多边形,使用编好的自动化脚本,而创建墙体是非常有用的,程序的意义就是重复去做我们定义好的动作,避免机械化的重复劳动,节约时间,而且这种执行次数越多,节约的时间越多。