Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分离轴:计算多边形的MTV&;线段_C++_Algorithm_Math_Computational Geometry - Fatal编程技术网

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;
有关图像:请参见。请提供图片链接,有人可能会编辑此问题。对于需要的人:对于图片:请参阅。请提供图片链接,有人可能会编辑此问题。对于需要的人: