找出三角形的原点是否位于三角形内部

时间:2015-03-29 09:15:25

标签: c++

我试图找出给定三角形的内部或外部是否有原点。

下面的代码总是给出 Origin不在给定的三角形内。我不知道为什么会这样以及如何解决它。

float distance(int x1, int y1,int x2,int y2)
{
    int dis = (((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
    float dis1 = sqrt(dis);
    return dis1;
}

float AreaOfTriangle(float a, float b, float c)
{
    float s = (a+b+c)/2;
    float Area = sqrt(s*(s-a)*(s-b)*(s-c));
    cout << Area << endl;
    return Area;
}

int main()
{
    float dis1 = distance(-1,-1,0,1);
    float dis2 = distance(1,-1,-1,-1);
    float dis3 = distance(0,1,1,-1);

    float area = AreaOfTriangle(dis1,dis2,dis3);
    float dis4 = distance(0,0,-1,-1);
    float dis5 = distance(0,0,1,-1);

    float area1 = AreaOfTriangle(dis2,dis4,dis5);
    float dis6 = distance(0,1,0,0);

    float area2 = AreaOfTriangle(dis1,dis4,dis6);
    float area3 = AreaOfTriangle(dis3,dis5,dis6);
    float a = area1 + area2 + area3;

    cout << endl << a;

    if(area == a)
    {
        cout << "Origin is Inside Given Triangle";
    }
    else
    {
        cout << "Origin is not Inside Given Triangle";
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

我认为你可以做到这一点

考虑点a,b和c(ax,ay),(bx,by)和(cx,cy)

定义A = ax + ay,B = bx + by和C = cx + cy

定义z = y(B / A)+(1-y)(C / A)

为y = 0和y = 1计算z。如果其中一个或两个值介于0和1之间,则三角形包含原点

答案 1 :(得分:0)

给定点a,b,c。

  • 如果a,b或c包含原点,则三角形abc包含原点。
  • 如果a,b和c都在原点的左侧或右侧,则abc不能包含原点。
  • 如果a,b和c都在原点之上或之下,则abc不能包含原点。
  • 如果a,b位于原点的左侧,而c位于原点的右侧,则如果行ac和bc穿过原点,则abc包含原点。 (也适用于a,左边和b,c右边的原点)
  • 如果a,b位于原点的左侧,而c位于原点的右侧,则如果行ac位于原点之上且bc位于原点之下,则abc包含原点。 (也适用于a,左边和b,c右边的原点)

当然,这是非常通用的,也可以推断到任何一点,前三个步骤是优化。在实施过程中还需要解决一些问题,但应该成立。

你需要弄清楚如何正确地进行浮点运算。