How to order points anti clockwise

后端 未结 5 1643
梦毁少年i
梦毁少年i 2021-02-20 04:22

Lets take thess points.

pt={{-4.65371,0.1},{-4.68489,0.103169},{-4.78341,0.104834},{-4.83897,0.100757},
{-4.92102,0.0949725},{-4.93456,0.100181},{-4.89166,0.1226         


        
5条回答
  •  太阳男子
    2021-02-20 04:53

    I've just read in a comment to nikie's answer that what you really want is the algorithm for an airfoil. So, I am posting another (unrelated) answer to this problem:

    enter image description here

    Seems easier than the general problem, because it is "almost convex". I think the following algorithm reduce the risks that FindShortestTour inherently has at the acute vertex:

    1. Find the ConvexHull (that accounts for the upper and attack surfaces)
    2. Remove from the set the points in the convex hull
    3. Perform a FindShortestTour with the remaining points
    4. Join both curves at the nearest endpoints
    5. Voilà

    Like this:

    pt1 = Union@pt;
    << ComputationalGeometry`
    convexhull = ConvexHull[pt1, AllPoints -> True];
    pt2 = pt1[[convexhull]];
    pt3 = Complement[pt1, pt2];
    pt4 = pt3[[(FindShortestTour@pt3)[[2]]]];
    If[Norm[Last@pt4 - First@pt2] > Norm[Last@pt4 - Last@pt2], pt4 = Reverse@pt4];
    pt5 = Join[pt4, pt2, {pt4[[1]]}];
    Graphics[{Arrowheads[.02], Arrow@Partition[pt5, 2, 1], 
              Red, PointSize[Medium], Point@pt1}]
    

    enter image description here

提交回复
热议问题