Math 求三角形、正方形和圆形下的整数点数

Math 求三角形、正方形和圆形下的整数点数,math,geometry,Math,Geometry,对于圆,我试着检查从中心到半径范围内的所有点。对于正方形,我测试从左下角到右上角的所有点,对于三角形,我测试行列式的符号。我在输入单个值时得到正确答案,即1个圆环、1个正方形或1个三角形,但当它们中有>1个时,答案就不正确了。例如,在这种情况下: C 10 10 3 S 9 8 4 T 7 9 10 8 8 10 其中C是圆,S是正方形,T是三角形,(10,10)是半径为3的圆心。(9,8)是第4边正方形的最左角,(7,9),(10,8)和(8,10)是三角形的三个顶点,它们覆盖的所有不同点是

对于圆,我试着检查从中心到半径范围内的所有点。对于正方形,我测试从左下角到右上角的所有点,对于三角形,我测试行列式的符号。我在输入单个值时得到正确答案,即1个圆环、1个正方形或1个三角形,但当它们中有>1个时,答案就不正确了。例如,在这种情况下:

C 10 10 3
S 9 8 4
T 7 9 10 8 8 10
其中C是圆,S是正方形,T是三角形,(10,10)是半径为3的圆心。(9,8)是第4边正方形的最左角,(7,9),(10,8)和(8,10)是三角形的三个顶点,它们覆盖的所有不同点是34,但我得到37

以下是我尝试过的:

typedef pair<int,int> point;
set<point>myset;
set<point>::iterator it;

int findDeter(int x1,int y1,int x2,int y2,int x0,int y0)
{
int ret = x1*(y2-y0)-y1*(x2-x0)+(x2*y0-x0*y2)
         -x2*(y1-y0)+y2*(x1-x0)-(x1*y0-x0*y1)
         +x0*(y1-y2)-y0*(x1-x2)+(x1*y2-x2*y1);
return ret;
}
bool sameSign(int x, int y)
{
if(x==0||y==0)
return true;
    return (x >= 0) ^ (y < 0);
}
int main()
{
int t,i,j,k,n;
int x,y,r,x1,y1,len;
int xmax,ymax,xmin,ymin;
int D1,D2,D3;
int ax,ay,bx,by,cx,cy;
char shape,dump;
scanf("%d",&t);
while(t--)
{
    myset.clear();
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%c",&dump);
        scanf("%c",&shape);
        if(shape=='C')
        {
            scanf("%d %d %d",&x,&y,&r);
            for(j=x;j<=x+r;j++)
            {
                for(k=y;k<=y+r;k++)
                {
                    point p(j,k);
                    myset.insert(p);
                }
            }
            for(j=x-r;j<x;j++)
            {
                for(k=y-r;k<y;k++)
                {
                    point p(j,k);
                    myset.insert(p);
                }
            }   

        }
        else if(shape=='S')
        {
            scanf("%d %d %d",&x1,&y1,&len);
            for(j=x1;j<=x1+len;j++)
            {
                for(k=y1;k<=y1+len;k++)
                {
                    point p(j,k);
                    myset.insert(p);
                }
            }

        }
        else
        {
            //printf("here\n");
            scanf("%d %d %d %d %d %d",&ax,&ay,&bx,&by,&cx,&cy);
            /*a1=ax;a2=ay;
            b1=bx;b2=by;
            c1=cx;c2=cy;*/
            xmax = max(ax,max(bx,cx));
            ymax = max(ay,max(by,cy));
            xmin = min(ax,min(bx,cx));
            ymin = min(ay,min(by,cy));
            /*for each point P check if sum(the determinants PAB,PAC and PBC have the same signs)*/
            for(j=xmin;j<=xmax;j++)
            {
                for(k=ymin;k<=ymax;k++)
                {
                    D1 = findDeter(ax,ay,bx,by,j,k);
                    //printf("D1 : %d\n",D1);
                    D2 = findDeter(bx,by,cx,cy,j,k);
                    //printf("D2 : %d\n",D2);
                    D3 = findDeter(cx,cy,ax,ay,j,k);
                    //printf("D3 : %d\n",D3);
                    if(sameSign(D1,D2)&&sameSign(D2,D3)&&sameSign(D1,D3))
                    {
                        //printf("here\n");
                        point p(j,k);
                        myset.insert(p);
                    }
                }
            }
        }

    }
    printf("%d\n",myset.size());
}
return 0;
}
typedef对点;
setmyset;
set::迭代器;
int findder(int x1、int y1、int x2、int y2、int x0、int y0)
{
int-ret=x1*(y2-y0)-y1*(x2-x0)+(x2*y0-x0*y2)
-x2*(y1-y0)+y2*(x1-x0)-(x1*y0-x0*y1)
+x0*(y1-y2)-y0*(x1-x2)+(x1*y2-x2*y1);
返回ret;
}
布尔sameSign(整数x,整数y)
{
如果(x==0 | | y==0)
返回true;
返回(x>=0)^(y<0);
}
int main()
{
int t,i,j,k,n;
整数x,y,r,x1,y1,len;
int-xmax,ymax,xmin,ymin;
int D1、D2、D3;
int ax、ay、bx、by、cx、cy;
炭状,倾倒;
scanf(“%d”、&t);
而(t--)
{
myset.clear();
scanf(“%d”和“&n”);

对于(i=0;i,在对代码进行了大量重构之后,为了让我更清楚地了解发生了什么-我认为错误在循环代码中。我已经在下面列出了完整的重构代码,但麻烦的部分是:

struct Circle
{
   int x;
   int y;
   int r;

   void add_covered_points( set<points> & pts ) const
   {
      for(int j=x;j<=x+r;j++)
      {
         for(int k=y;k<=y+r;k++)
         {
            pts.insert(point(j,k));
         }
      }
      for(int j=x-r;j<x;j++)
      {
         for(int k=y-r;k<y;k++)
         {
            pts.insert(point(j,k));
         }
      }  
   }
};
struct循环
{
int x;
int-y;
INTR;
无效添加覆盖点(集合和点)常数
{

对于(int j=x;j,在对代码进行了大量重构之后,为了让我更清楚地了解正在发生的事情,我会说错误在循环代码中。我在下面列出了完整的重构代码,但麻烦的部分是:

struct Circle
{
   int x;
   int y;
   int r;

   void add_covered_points( set<points> & pts ) const
   {
      for(int j=x;j<=x+r;j++)
      {
         for(int k=y;k<=y+r;k++)
         {
            pts.insert(point(j,k));
         }
      }
      for(int j=x-r;j<x;j++)
      {
         for(int k=y-r;k<y;k++)
         {
            pts.insert(point(j,k));
         }
      }  
   }
};
struct循环
{
int x;
int-y;
INTR;
无效添加覆盖点(集合和点)常数
{
for(int j=x;j适用于计算具有整数顶点的简单多边形内部的整数点

我们可以看到圆的解。

适用于计算具有整数顶点的简单多边形内部的整数点


我们可以看到圆的解决方案。

您发现哪些点不在三角形中?这不是指向错误吗?您应该检查scanf的返回值,它可能无法解析正确的值数。另外,什么是转储?@Angelom:转储正在读取换行符,您发现哪些点不在三角形中三角形?这不是指向错误吗?你应该检查scanf的返回值,它可能无法解析正确数量的值。还有,dump是什么?@Angelom:dump正在读取换行符谢谢,但是这段圆代码没有为以下情况提供正确的值:c5 5 2,它是13而不是139@pranay你为什么不呢绘制它列为内部的点,并将这些点与您期望的内部点进行比较?形状如何比较?谢谢,但此圆代码没有为以下情况提供正确的值:C5 2,它是13,而不是139@pranay你为什么不画出它列为内饰的点,并与你体验的点进行比较呢ct是内部的?形状如何比较?
typedef pair<int,int> point;


int findDeter(int x1,int y1,int x2,int y2,int x0,int y0)
{
int ret = x1*(y2-y0)-y1*(x2-x0)+(x2*y0-x0*y2)
         -x2*(y1-y0)+y2*(x1-x0)-(x1*y0-x0*y1)
         +x0*(y1-y2)-y0*(x1-x2)+(x1*y2-x2*y1);
return ret;
}
bool sameSign(int x, int y)
{
if(x==0||y==0)
return true;
    return (x >= 0) ^ (y < 0);
}

struct Circle
{
   int x;
   int y;
   int r;

   void add_covered_points( set<points> & pts ) const
   {
      for(int j=x;j<=x+r;j++)
      {
         for(int k=y;k<=y+r;k++)
         {
            pts.insert(point(j,k));
         }
      }
      for(int j=x-r;j<x;j++)
      {
         for(int k=y-r;k<y;k++)
         {
            pts.insert(point(j,k));
         }
      }  
   }
};

struct Square
{
  int x1,y1,len;
  void add_covered_points( set<points> & pts ) const
  {
     for(int j=x1;j<=x1+len;j++)
     {
        for(int k=y1;k<=y1+len;k++)
        {
           myset.insert(point(j,k));
        }
     }
  }
};

struct Triangle
{
  int ax,ay,bx,by,cx,cy;
  void add_covered_points( set<points> & pts ) const
  {
     int xmax = max(ax,max(bx,cx));
     int ymax = max(ay,max(by,cy));
     int xmin = min(ax,min(bx,cx));
     int ymin = min(ay,min(by,cy));

     /*for each point P check if sum(the determinants PAB,PAC and PBC have the same signs)*/
     for(int j=xmin;j<=xmax;j++)
     {
       for(int k=ymin;k<=ymax;k++)
       {
          int D1 = findDeter(ax,ay,bx,by,j,k);
          int D2 = findDeter(bx,by,cx,cy,j,k);
          int D3 = findDeter(cx,cy,ax,ay,j,k);

          if(sameSign(D1,D2)&&sameSign(D2,D3)&&sameSign(D1,D3))
          {
            pts.insert(point(j,k));
          }
        }
     }
  }
};


int main()
{
set<point>myset;
int t;
scanf("%d",&t);
while(t--)
{
    myset.clear();
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        char dump;
        char shape;
        scanf("%c",&dump);
        scanf("%c",&shape);
        if(shape=='C')
        {
            Circle c;
            scanf("%d %d %d",&c.x,&c.y,&c.r);
            c.add_covered_points( myset );
        }
        else if(shape=='S')
        {
            Square s;
            scanf("%d %d %d",&s.x1,&s.y1,&s.len);
            s.add_covered_points( myset );
        }
        else
        {
            Triangle t;
            int ax,ay,bx,by,cx,cy;
            scanf("%d %d %d %d %d %d",&t.ax,&t.ay,&t.bx,&t.by,&t.cx,&t.cy);
            t.add_covered_points( myset );
        }
    }
}
return 0;
}