关于搜索三角形内外点的程序

时间:2014-10-19 10:57:59

标签: c++ geometry dev-c++

我在" dev-c ++"中编写了一个程序。关于讨论一个问题。我们想要知道它是在三角形内或外面。为什么我的程序无法正常工作?我该怎么办? 这是我的计划:

#include <iostream>
#include <math.h>
int main()
{
    int n,a,b,c,d;
    int x[n];
    int y[n];
    n=1;
    while (n<=4)
    {
        std:: cin >> x[n];
        std:: cin >> y[n];
        n=n+1;
    }
    a= fabs((1/2)*((x[1]*(y[2]-y[3]))+(x[2]*(y[3]-y[1]))+(x[3]*(y[1]-y[2]))));
    b= fabs((1/2)*((x[1]*(y[2]-y[4]))+(x[2]*(y[4]-y[1]))+(x[4]*(y[1]-y[2]))));
    c= fabs((1/2)*((x[1]*(y[3]-y[4]))+(x[3]*(y[4]-y[1]))+(x[4]*(y[1]-y[3]))));
    d= fabs((1/2)*((x[2]*(y[3]-y[4]))+(x[3]*(y[4]-y[2]))+(x[4]*(y[2]-y[3]))));
        if ((b+c+d)!= a)
    {
        std:: cout<< "out of triangle\n";
    }
    if (b+c+d==a)
    {
        std:: cout <<"in triangle\n";
    }
}

1 个答案:

答案 0 :(得分:1)

此程序的输入仅包含整数坐标,但要检查点是否位于三角形内,此方法需要知道三角形的区域。三角形的区域是

A = width * height / 2

并且由于最终除法,它可能返回浮点数。因此,中间变量abcd必须至少为float

只要=右侧的所有常量和变量都是整数,C也会将结果计算为整数。只有在最后一步,结果才会转换为目标类型。因此,

double x = 2*3/4;

将使用整数计算为2*3/4并生成6/4 - &gt; 1,只有然后转换为双倍值:1.000。强制中间体为float类型会修复它:

double x = 2.0*3/4;

然后x = 1.5


请注意,使用浮点数时,您可能会遇到accuracy problems并进行最终比较

if (b+c+d==a)
  ...

幸运的是,这对你的分区来说不会有问题2.小数值0.5可以用floatdouble格式完全表示,只要&#39 ;全&#39;部分不超过可用数字的数量。但是,记住它是一件好事。