C++ 分离轴:计算多边形的MTV&;线段
几个月来,我一直在尝试编写一个函数,返回应用于线段所需的最小平移,以便将线段与相交的多边形分开。我使用了分离轴定理,似乎我能够正确地计算出大小,然而,返回的方向有时是错误的。然而,当返回的翻译不正确时,相反的翻译总是正确的 在下面的图片中,黄线是用于计算的,紫线是黄线+平移,红线是黄线减去平移。正如你所看到的,紫色或红色的线在不同的位置是正确的,但我不确定在什么条件下返回哪一行 所以我的问题是:在什么条件下,翻译实际上需要翻转,以便我的函数总是返回具有正确方向的翻译C++ 分离轴:计算多边形的MTV&;线段,c++,algorithm,math,computational-geometry,C++,Algorithm,Math,Computational Geometry,几个月来,我一直在尝试编写一个函数,返回应用于线段所需的最小平移,以便将线段与相交的多边形分开。我使用了分离轴定理,似乎我能够正确地计算出大小,然而,返回的方向有时是错误的。然而,当返回的翻译不正确时,相反的翻译总是正确的 在下面的图片中,黄线是用于计算的,紫线是黄线+平移,红线是黄线减去平移。正如你所看到的,紫色或红色的线在不同的位置是正确的,但我不确定在什么条件下返回哪一行 所以我的问题是:在什么条件下,翻译实际上需要翻转,以便我的函数总是返回具有正确方向的翻译 const Projec
const Projection Polygon::Project(const Axis &a) const
{
float min = a.Dot(GetPoint(0));
float max = min;
for (unsigned i = 1; i < GetPointCount(); i++)
{
float prj = a.Dot(GetPoint(i));
if (prj < min)
min = prj;
else if (prj > max)
max = prj;
}
return Projection(min, max);
}
const Projection Segment::Project(const Axis &a) const
{
const float dot0 = a.Dot(GetPoint(0));
const float dot1 = a.Dot(GetPoint(1));
return Projection(std::min(dot0, dot1), std::max(dot0, dot1));
}
const float Projection::GetOverlap(const Projection &p) const
{
// x = min & y = max
return std::min(y - p.x, p.y - x);
}
const Vector2 Segment::GetTranslation(const Polygon &p) const
{
float Overlap = std::numeric_limits<float>::infinity();
Axis smallest;
Vector2 translation;
AxesVec axes(p.GetAxes());
axes.push_back(GetAxis());
for (auto && axis : axes)
{
const Projection pA = p.Project(axis);
const Projection pB = Project(axis);
if (pA.IsOverlap(pB))
{
const float o = pA.GetOverlap(pB);
if (o < Overlap)
{
Overlap = o;
smallest = axis;
}
}
}
translation = smallest * (Overlap + 1);
return translation;
}
const投影多边形::投影(const轴&a)const
{
float min=a.Dot(GetPoint(0));
浮动最大值=最小值;
for(无符号i=1;i最大值)
max=prj;
}
返回投影(最小值、最大值);
}
常量投影段::项目(常量轴和a)常量
{
常量浮点dot0=a.Dot(GetPoint(0));
常量浮点点1=a.Dot(GetPoint(1));
返回投影(std::min(dot0,dot1),std::max(dot0,dot1));
}
常量浮点投影::GetOverlap(常量投影和p)常量
{
//x=最小值,y=最大值
返回标准::最小值(y-p.x,p.y-x);
}
常量向量2段::GetTranslation(常量多边形&p)常量
{
浮点重叠=标准::数值限制::无穷大();
轴最小;
向量2翻译;
AxesVec轴(p.GetAxes());
向后推(GetAxis());
用于(自动轴和轴:轴)
{
const Projection pA=p.项目(轴);
常量投影pB=项目(轴);
if(pA.IsOverlap(pB))
{
常数浮点o=pA.GetOverlap(pB);
if(o<重叠)
{
重叠=o;
最小=轴;
}
}
}
平移=最小*(重叠+1);
返回翻译;
}
问题在于GetOverlap
函数返回重叠的大小,但不返回意义(左或右)
您可以将其更改为:
if(y - p.x < p.y - x)
return y - p.x;
else
return x - p.y;
问题在于
GetOverlap
函数返回重叠的大小,但不返回意义(左或右)
您可以将其更改为:
if(y - p.x < p.y - x)
return y - p.x;
else
return x - p.y;
有关图像:请参见。请提供图片链接,有人可能会编辑此问题。对于需要的人:对于图片:请参阅。请提供图片链接,有人可能会编辑此问题。对于需要的人: