如何计算此程序中的多边形面积和周长? [英] how do I calculate polygons area and perimeter in this program?

查看:154
本文介绍了如何计算此程序中的多边形面积和周长?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <iostream.h>
 #include <graphics.h>
 #include    <conio.h>
 #include     <math.h>

 void show_screen( );

 void Polygon(const int,const int []);

 void Line(const int,const int,const int,const int);

 int main( )
    {
       int driver=VGA;
       int mode=VGAHI;

       int n=0;

       do
      {
	 show_screen( );

	 gotoxy(12,13);
	 cout<<"Enter the number of points : ";
	 cin>>n;

	 int *coordinates=new int[(n*2)];

	 for(int count=0;count<n;count++)>
	{
	   gotoxy(8,18);
	   cout<<"Coordinates of Point-"<<(count+1)<<" (x"<<(count+1)<<",y"<<(count+1)<<") :";


	   gotoxy(12,21);
	   cout<<"Enter the value of x"<<(count+1)<<" = ";
	   cin>>coordinates[(count*2)];

	   gotoxy(12,22);
	   cout<<"Enter the value of y"<<(count+1)<<" = ";
	   cin>>coordinates[((count*2)+1)];

	   gotoxy(8,18);
	   cout<<"                                            ";

	   gotoxy(12,21);
	   cout<<"                                            ";

	   gotoxy(12,22);
	   cout<<"                                            ";
	 }

	 initgraph(&driver,&mode,"c:\\tc\\Bgi");

	 setcolor(15);
	   Polygon(n,coordinates);

	     delete coordinates;

	 setcolor(15);
	   outtextxy(110,460,"Press <enter> to continue or any other key to exit.");

	 int key=int(getch( ));

	 if(key!=13)
	break;
      }
       while(1);

       return 0;
    }

 void Polygon(const int n,const int coordinates[])
    {
       if(n>=2)
      {
	 Line(coordinates[0],coordinates[1],
			 coordinates[2],coordinates[3]);

	 for(int count=1;count<(n-1);count++)
	Line(coordinates[(count*2)],coordinates[((count*2)+1)],
			coordinates[((count+1)*2)],
			coordinates[(((count+1)*2)+1)]);
      }
    }

void Line(const int x_1,const int y_1,const int x_2,const int y_2)
    {
       int color=getcolor( );

       int x1=x_1;
       int y1=y_1;

       int x2=x_2;
       int y2=y_2;

       if(x_1>x_2)
      {
	 x1=x_2;
	 y1=y_2;

	 x2=x_1;
	 y2=y_1;
      }

       int dx=abs(x2-x1);
       int dy=abs(y2-y1);
       int inc_dec=((y2>=y1)?1:-1);

       if(dx>dy)
      {
	 int two_dy=(2*dy);
	 int two_dy_dx=(2*(dy-dx));
	 int p=((2*dy)-dx);

	 int x=x1;
	 int y=y1;

	 putpixel(x,y,color);

	 while(x<x2)>
	{
	   x++;

	   if(p<0)
	      p+=two_dy;

	   else
	      {
	     y+=inc_dec;
	     p+=two_dy_dx;
	      }

	   putpixel(x,y,color);
	}
      }

       else
      {
	 int two_dx=(2*dx);
	 int two_dx_dy=(2*(dx-dy));
	 int p=((2*dx)-dy);

	 int x=x1;
	 int y=y1;

	 putpixel(x,y,color);

	 while(y!=y2)
	{
	   y+=inc_dec;

	   if(p<0)
	      p+=two_dx;

	   else
	      {
	     x++;
	     p+=two_dx_dy;
	      }

	   putpixel(x,y,color);
	}
      }
    }

void show_screen( )
    {
       restorecrtmode( );
       textmode(C4350);

       textbackground(1);
       cprintf(" Polygon ");
       textbackground(8);


       gotoxy(1,2);
    }



如何计算多边形的面积和周长?


how to calculate area and perimeter of polygon?

推荐答案

有一个简单的算法用于计算多边形的面积:



1.选择一个点P1。通过将z坐标设置为0将此点解释为3D点。

2.对于所有剩余(n-1)点Pi:

- 解释Pi和Pi +通过将z坐标设置为0,将1作为3D点。

- 计算矢量乘积(Pi-P1)x(Pi + 1-P1)

- 加起来结果向量

3.向量和的长度是多边形的总面积



这背后的概念是长度从每个矢量积得到的矢量对应于三个相关点的三角形区域。然而,在凹点处,矢量将指向相反的方向,因此将减去该区域而不是相加。如果你绘制一些示例多边形,你会发现确实有必要减去这些区域而不是添加它们。



PS:你实际上并不需要引入3D矢量,因为矢量产品的x和y坐标始终为0,因此您只需要计算z坐标,这恰好是两个2D矢量(Pi-P1)和(Pi)的2D行列式+ 1-P1)。



PPS:修正了指数值。例如,请参见此处的第2.0.1段: http://www.faqs.org/faqs/graphics/algorithms -faq / [ ^ ]



另一个PS:

我试图找出这个算法的来源,但发现我在这里描述的是一个专门的版本我实际上用来确定多边形的方向,而不是它的面积,尽管它确实按照描述计算了面积。事实上,如果你只是对这个区域感兴趣,那么第一点可以是任何一点,包括(0,0),你得到的那些,然后可以在各个网站上找到,例如: G。 http://mathworld.wolfram.com/PolygonArea.html [ ^ ]或此处: https: //en.wikipedia.org/wiki/Shoelace_formula [ ^ ]
There's a simple algorithm for calculating the area of a polygon:

1. Choose one point P1. Interpret this point as 3D point by setting the z-coordinate to 0.
2. For all remaining (n-1) points Pi:
- interpret Pi and Pi+1 as 3D points by setting the z-coordinate to 0.
- calculate the vector product (Pi-P1)x(Pi+1-P1)
- add up the resulting vectors
3. the length of the vector sum is the total area of the polygon

The concept behind this is that the length of the vector you get from each vector product corresponds to the area of the triangle of the three involved points. At concave points, however, the vector will point in the opposite direction, and therefore the area will be subtracted rather than added. If you draw a few example polygons you'll see that it is indeed necessary to subtract these areas rather than add them.

P.S.: you don't actually have to introduce 3D vectors, as the vector product will always have it's x and y coordinate at 0, so you only need to calculate the z-coordinate, which happens to be the 2D determinant of the two 2D vectors (Pi-P1) and (Pi+1-P1).

P.P.S.: fixed the index values. See for instance paragraph 2.0.1 in here: http://www.faqs.org/faqs/graphics/algorithms-faq/[^]

Another P.S.:
I've tried to pinpoint the source of this algorithm, but found that what I described here is a specialized version that I actually used to determine the orientation of a polygon, not it's area, although it does calculate the area as described. In fact, if you're just interested in the area, the first point can be any point, including (0,0), and the firmula you get, then can be found on various sites, e. g. http://mathworld.wolfram.com/PolygonArea.html[^] or here: https://en.wikipedia.org/wiki/Shoelace_formula[^]


可以通过三角测量计算区域:以三角形分隔多边形并添加它们的区域。周长更复杂。你需要找到所有的外部并添加它们。



为此,你可能会寻找一些algorhitm。我会写一个测试函数来证明一个点不在三角形中,所以它是下一个三角形的一部分。



或者你可能计算所有的中心点点,比计算矢量(和角度)来对三角形和周长的点进行排序。



祝你好运。
The areas can get computed via triangulation: you seperate the polygon in triangles and add their areas. The perimeter is more complex. You need to find all outsides and add them.

For that you may look for some algorhitm. I would write a test function to proof that a points is NOT in a triangle, so it is part of a next triangle.

Or maybe you compute the centerpoint of all points, than compute the vector (and angle) to sort the points for triangles and perimeter.

Good luck.


这篇关于如何计算此程序中的多边形面积和周长?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆