确定顶点是否凸出。帮助理解

时间:2013-06-18 16:00:07

标签: java convex

我正在研究以下代码。

boolean convex(double x1, double y1, double x2, double y2, 
       double x3, double y3)
{
if (area(x1, y1, x2, y2, x3, y3) < 0)
    return true;
else
    return false;
}


/* area:  determines area of triangle formed by three points
 */
double area(double x1, double y1, double x2, double y2,
    double x3, double y3)
{
double areaSum = 0;

areaSum += x1 * (y3 - y2);
areaSum += x2 * (y1 - y3);
areaSum += x3 * (y2 - y1);

/* for actual area, we need to multiple areaSum * 0.5, but we are
     * only interested in the sign of the area (+/-)
     */

return areaSum;
}

我不理解该区域为负面的概念。 区域不应该总是积极的吗?也许我对这里的术语缺乏了解。 我试图联系原作者,但这段代码大约8岁,我无法联系原作者。 这种确定给定顶点x2y2是否凸出的方法看起来确实是移动的。我真的很想了解它。 任何方向或参考,以帮助我理解这段代码将非常感激。

源代码:http://cgm.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Ian/applets/BruteForceEarCut.java

3 个答案:

答案 0 :(得分:3)

该算法基本上使用两个向量的dot product并解释结果。这是用于查找凸包的Gift Wrapping Algorithm的核心。

由于a dot b也等于|a|*|b|*cos(theta),如果结果为正,则theta的cos必须为正且因此为凸。根据关于跨产品的维基文章......

  

因为交叉乘积的大小超过了正弦的正弦   它的论点之间的角度,交叉乘积可以被认为是一个   以与点积相同的方式测量“垂直度”   一种“并行性”的衡量标准。给出两个单位向量,它们的交叉   如果两者垂直,则产品的大小为1   如果两者平行则为零。反之亦然   两个单位向量的点积。

在我看来,“区域”的使用在原始编码器的一部分上略有误导。

答案 1 :(得分:3)

该算法使用一个非常简单的公式,您可以使用该公式计算三角形面积的两倍。

这个公式有两个好处:

  • 它不需要任何分割
  • 如果该点是逆时针顺序,则返回负区域。

在代码示例中,区域的实际值无关紧要,只需要结果的符号。

该公式还可用于检查三个点是否共线。

您可以在此网站上找到有关此公式的更多信息:http://www.mathopenref.com/coordtrianglearea.html

答案 2 :(得分:2)

你知道积分是如何运作的,对吗?考虑积分的一种方法是在积分曲线下的面积。对于严格为正的函数,该定义效果很好,但是当函数在某些时候变为负数时,就会出现问题,因为那时你必须取绝对值,对吗?

实际上并非总是如此,在某些情况下,将曲线置为负值非常有用。回想一下前面所说的:曲线下 区域。负无穷大和我们的功能之间的所有空间。显然,这是荒谬的,对吧?考虑它的更好方法是曲线下面积与x轴下面积之间的差异。这样,当函数为正时,我们的曲线获得更多区域,当它为负时,它的增益小于x轴。

同样的事情适用于不严格功能的平面图。为了真正确定这一点,我们必须定义我们的边缘在它周围移动时的方向。我们可以定义它,使得曲线右侧的所有区域都在区域内,左侧的所有区域都在外面(或者我们可以反过来定义它,但我将使用第一种方式)。 / p>

所以我们的数字包括从那里到直接在我们右边的飞机无限远边缘的所有区域。顺时针方向封闭的区域实际上包括其传统内部两次逆时针封闭的区域根本不包括它们的传统内部。那么,该地区是我们地区与整个飞机之间的差异。

如果您了解凹形或凸形的实际含义,将其应用于凹面是相当简单的。如果要从平面切割出一个区域,则给出的三角形是凹的,如果要为其添加额外的区域,则它是凸的。这与确定我们的区域完全相同,因此正面区域对应凸面形状,负面区域对应凹面形状。

你也可以用这个概念模型做其他奇怪的事情。例如,您可以将一个区域内外翻过来。通过反转边缘方向。

对不起,如果这有点难以理解,但这是我理解负面区域的实际方式。