找出无序离散点的先后顺序?

FindCurvePath和ListCurvePathPlot函数的选项太少用起来不灵活,试着手写了一个能限定最大距离的findCurve,给定一个distancelimit,两点距离超过distancelimit就不会被视做一条线上的相邻两点代码如下sowCurve := Module]; restlist = Rest; curvelist = {trypoint}; If; Return]; nextnum = Nearest]; While] - trypoint] \u0026lt; distancelimit, trypoint = restlist]; AppendTo]]; restlist = Delete; If; Return]; nextnum = Nearest]; ]; trypoint = curvelist]; nextnum = Nearest]; While] - trypoint] \u0026lt; distancelimit, trypoint = restlist]; PrependTo]]; restlist = Delete; If; Return]; nextnum = Nearest]; ]; Sow; sowCurve; ];findCurve := Reap]];偷懒没写注释,不过我觉得应该不会有什么理解上的障碍。算法十分原始,就是逐个找最近的点,符合要求就加进去,不符合就停止循环。完全没有优化过所以效率堪忧,但是点少的时候速度还算能忍(*然而我发现内置的FindCurvePath效率好像更加堪忧。。。。。*)生成一组乱序点测试了一下,如下图找出无序离散点的先后顺序?
【找出无序离散点的先后顺序?】
从图像和颜色可以看到FindCurvePath不但把分开的两处连上了,还诡异地把sin的图像分成了四段,实在是不知道这东西内部是怎么实现的。。。。============================6月28日更新=============================你给的那个例子是因为y方向的间距过大,所以如果distancelimit取小了就会断开,取大了又会出bug。所以需要把这个机制改一下,比如可以对x方向和y方向分别设置限制,代码如下sowCurve := Module == 2, continueQ = Function \u0026lt; distancelimit]], continueQ = Function \u0026lt; distancelimit] ]; trypoint = pts]; restlist = Rest; curvelist = {trypoint}; If; Return]; nextnum = Nearest]; While], trypoint], trypoint = restlist]; AppendTo]]; restlist = Delete; If; Return]; nextnum = Nearest];]; trypoint = curvelist]; nextnum = Nearest]; While], trypoint], trypoint = restlist]; PrependTo]]; restlist = Delete; If; Return]; nextnum = Nearest];]; Sow; sowCurve;];findCurve := Reap]];用的时候可以有两种模式,findCurve这种就是相邻两点距离小于0.5,findCurve这种就是相邻两点x之差小于0.1,y之差小于0.5这种修改是很灵活的,完全可以根据自己的需要改成别的判断方法,只有修改continueQ那行就可以
■网友
如果你想得到排完序的点组成的list,用FindCurvePath函数可以直接解决如果你想直接得到连接后所得到的图像,用ListCurvePathPlot函数可以直接解决
■网友
高中刚毕业,非程序员,谈谈我的想法:取任意一点,然后,找到离它最近的一个点两点连线,取垂直(任意均可),将平面分成两个部分。取之前取得的点不在的平面内的,距离第一个点最近的点这时已经取了三个点,这三个点(应该)是一条线上的。然后用类似的办法取完所有点如果不能取完,取没有取过的点中的任意一点,重新开始计算一条新的线。其中,每次取最近的一点,不考虑已经取过的点。,如果两点距离超过一定阀值,可以终止取点(不取了,当作没有符合要求的点)


    推荐阅读