-3

我在一个文本文件中有一组包含 10000 行和 10 列的数据。这里有一些样本——

#      x1       y1       x2       y2       x3       y3       x4       y4      Area
1   0.0000   0.0000   0.8147   0.0000   0.8147   0.1355   0.0000   0.1355   0.1104
2   0.8147   0.0000   1.0000   0.0000   1.0000   0.1355   0.8147   0.1355   0.0251
3   0.8147   0.1355   0.9058   0.1355   0.9058   0.8350   0.8147   0.8350   0.0637
4   0.0000   0.1355   0.8147   0.1355   0.8147   1.0000   0.0000   1.0000   0.7043
5   0.9058   0.1355   1.0000   0.1355   1.0000   0.8350   0.9058   0.8350   0.0659
6   0.9058   0.8350   1.0000   0.8350   1.0000   1.0000   0.9058   1.0000   0.0155
7   0.8147   0.8350   0.9058   0.8350   0.9058   1.0000   0.8147   1.0000   0.0150

我想用这个程序检查这些点-

    #include <iostream>
    #include <cmath>
    using namespace std;

    double CheckPoint(){
        double slope, intercept,A, B, C, D,px, py,left, top, right, bottom,dx, dy;

        cin >> A; // take from  column
        cin >> B; // take from  column
        cin >> C; // take from column
        cin >> D; // take from  column
        cin >> px; // take value from other rows and column and check
        cin >> py; // take value from other rows and column and check

        dx = C - A;
        dy = D - B;
        slope = dy / dx;

        // y = mx + c
        // intercept c = y - mx
        intercept = B - slope * A; // which is same as D - slope * C

        // For Bounding Box
        if(A < C)
        {
            left = A;
            right = C;
        }
        else
        {
            left = C;
            right = A;
        }
        if(B < D)
        {
            top = B;
            bottom = D;
        }
        else
        {
            top = B;
            bottom = D;
        }

        if( slope * px + intercept > (py - 0.01) &&
            slope * px + intercept < (py + 0.01))
        {
            if( px >= left && px <= right && 
                py >= top && py <= bottom )
            {
               // cout the numbers of common point and the line number
            }
            else
               // cout the numbers of common point and the line number
        }
        else
            // cout no common point;
    }

    int main()
    {
        cout<<CheckPoint();
        return 0;
    } 
  • 首先我想

    • 从 x1 中取 A 的值
    • 从 y1 中取 B 的值
    • 从 x2 中取 C 的值
    • 从 y2 中取 D 的值
    • 并检查它们是否与 x3、y3、x4 和 y4 有任何共同点。但它不会检查它自己的行中的值。对于其他行,此过程也将继续。
  • 然后我想

    • 从 x2 中取 A 的值
    • 从 y2 中取 B 的值
    • 从 x3 中取 C 的值
    • 从 y3 中取 D 的值
    • 并检查它们是否与 x1、y1、x4 和 y4 有任何共同点。而且如上所述,它不会检查它自己的行的值,也会申请row2,row3 ....等。

回复评论的示例

当程序取 A=0.0000 B=0.0000 C=0.8147 D=0.0000 时,它不会将值与 x3=0.8147 y3=0.1355 x4=0.0000 y4=0.1355 进行比较。即它将跳过取值的行x1,y1,x2,y2。

同样,当它从第 2 行获取 A、B、C、D 的值时,即 0.A=8147 B=0.0000 C=1.0000 D=0.0000,然后它会跳过第 2 行中的 x3,y3,x4,y4 的值.

我希望它计算匹配点的数量并返回找到该点的行数。我该怎么做?

4

2 回答 2

1

显然,这个问题包括从一个还包含一些其他内容的列表中读取成对的数字 (x, y)。所以让我们先解决这个问题:

std::fstream fin("infile.txt");    // Adjust as needed. 


struct Point
{
   double x, y;
};

struct Line
{
   int lineNum; 
   Point pts[4]; 
   double area; 
}

Line ln; 

fin >> ln.lineNum;    // Read the line number. 
for(int i = 0; i < 4; i++)
{
   fin >> line.pts[i].x >> line.pts[i].y; 
}
fin >> ln.area; 

现在您可以使用“line”中的值来确定它是否符合您的条件,并输出相关信息。

于 2013-06-30T18:26:08.773 回答
0

这可能不是答案,而是对 OP 的澄清问题

假设文本文件是一个 4 边多边形和多边形面积的点表。

第一个问题是找到线段[x1,y1,x2,y2]和线段之间的任何交点[x3, y3, x4, y4]吗?

[x1,y1,x2,y2]您想对照其他行的点检查线段吗?

无论如何,我建议如下:

  • 创建一个包含 X 和 Y 值的类 Point。
  • 创建一个包含两个点的类 Line:

class Line
{
Point begin;
Point end;
};

  • 创建一个名为 Polygon 的类,它有 4 个点和一个区域:

class Polygon
{
Point point_container[4];
double area;
};

  • 将文件读入std::vector<Polygon>.
  • 根据点、线和多边形确定您的算法。
    考虑多边形、点和线(段)。

希望这可以消除混乱。我建议发表一篇新文章,用点和多边形来说话。

于 2013-06-30T18:25:34.513 回答