我无法找出解决以下问题的最佳方法。我已经尝试了多种方法来解决它们,但我总是碰到一些极端情况。
问题如下:
List
个坐标(x和y点)形成一个闭合的多边形。保证此列表形成一个多边形,其中点以顺时针方向排序。Set
坐标(x和y点),这些坐标来自上述List
坐标。 Set
中的所有点计算出形成的线的起点和终点。我遇到的问题是我无法弄清楚找到“最佳”起点和终点的方法。对于许多场景,您可以选择第一个和最后一个点(使用List
的索引)来形成起点和终点,但是这可能会导致一条线比它必须的长。
例如,假设我们有以下多边形:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 0
我们的线段必须包含以下Set
坐标:0, 7, 3
。
如果我们找到最小和最大索引,我们会得到index(0)
,index(7)
,因此我们可以形成行0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
,这是一个有效的行,但它比它需要的更长成为。最佳线段为7 -> 0 -> 1 -> 2 -> 3
。
如何以有效的方式找到最佳(最短的包含Set
)线段中的所有点?
对于上下文:我正在使用JTS Geometries绘制形状的应用程序。使用贝塞尔曲线平滑绘制的形状以产生“弯曲边缘”。绘制形状(通过丢弃点)后,用户可以编辑形状。我们想要使用他们修改的点来计算起点和终点(形成上面的Set
),这样我们就可以“平滑”仅受影响的区域。
答案 0 :(得分:1)
所以我们有一个Set
,我们需要按照索引的顺序将此集合移动到List
。
转换ISet
= [Index(i, List) for i in Set]
下一次排序ISet
对于ISet
中的连续项对和该对(最后,第一个)计算该对的距离。
以最大距离罚款。然后最好的结束和开始就是那对。
答案 1 :(得分:1)
将您的集合转换为排序列表,将此列表与其复制相连接,其中每个元素都添加了多边形顶点数N,然后在此双重列表中找到最长的空运行(邻居差异)。然后获得所需长度的子列表,将其转换为连续范围(但采用模N的元素)
#include <iostream>
#include <thread>
#include <vector>
#include <fstream>
#include <mutex>
using namespace std;
ofstream myfile;
std::mutex myMutex;
void doTask()
{
myMutex.lock();
myfile << "1\n";
myMutex.unlock();
}
void f()
{
vector<thread> threads;
for(int i = 0; i < 10; ++i)
{
threads.push_back(thread(doTask));
}
for(int j=0; j<10; j++) threads[j].join();
threads.erase(threads.begin(), threads.end());
}
int main()
{
myfile.open("a.txt");
for(int i=0; i<100; i++) f();
myfile.close();
return 0;
}
最大差异为7-3,因此最佳案例子列表以7开头,它是
(0,3,7) + (0+8,3+8,7+8) = (0,3,7,8,11,15)