精华内容
下载资源
问答
  • 多边形面积计算

    2012-04-25 14:28:11
    计算任意条边的多边形面积(指定格式的txt点文件,内附实例),程序简洁,对初学者有学习借鉴用处!
  • CASIO 5800多边形面积计算程序 CASIO 5800多边形面积计算程序
  • 发现一个很有意思且有用的多边形面积计算方式 - 鞋带公式.鞋带公式的表达式为:可以理解为,是把每个顶点向x轴做垂线,每个边和坐标轴构成的梯形面积矢量和,结果就是多边形面积.也可理解为用最大矩形的面积减去各个...

    发现一个很有意思且有用的多边形面积计算方式 - 鞋带公式.

    b1f95fc8a46e6d66.jpg

    鞋带公式的表达式为:

    c01cda093e07474e.png

    可以理解为,是把每个顶点向x轴做垂线,每个边和坐标轴构成的梯形面积矢量和,结果就是多边形面积.

    也可理解为用最大矩形的面积减去各个三角形面积得到中间的多边形面积.

    1. 鞋带公式实现def polygon_area(x,y):

    return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1)))

    2. 示例1 - 计算曲线与坐标轴的面积import numpy as np

    import matplotlib.pyplot as plt

    from numpy import trapz

    x = np.arange(0,1,0.001)

    y = np.sqrt(1-x**2)

    #

    plt.plot(x, y)

    plt.show()

    #

    area_value = polygon_area(np.append(x, 0), np.append(y, 0))

    3. 示例2 - detectron2 mask 面积def area(self):

    """

    Computes area of the mask.

    Only works with Polygons, using the shoelace formula

    Returns:

    Tensor: a vector, area for each instance

    """

    area = []

    for polygons_per_instance in self.polygons:

    area_per_instance = 0

    for p in polygons_per_instance:

    area_per_instance += polygon_area(p[0::2], p[1::2])

    area.append(area_per_instance)

    return torch.tensor(area)

    展开全文
  • 坐标与多边形面积计算工具V51
  • 微信小程序,测量程序计算。三角形多边形面积计算,坐标正反算...
  • C# 多边形面积计算公式

    千次阅读 2019-06-26 16:46:48
    C# GMap.Net 计算多边形面积 https://www.cnblogs.com/JiNerd/p/3934372.html C# 多边形面积计算公式 https://www.cnblogs.com/Khan-Sadas/p/10135717.html
    展开全文
  • 参考文章中的介绍方法任意多边形面积计算公式 用代码的形式表达 /** * 根据鞋带定理计算 * @author YiDianDian */ public class Area { public static void main(String[] args) { Point point1 = new Point(3...

    参考文章中的介绍方法任意多边形面积计算公式

    用代码的形式表达

    /**
     * 根据鞋带定理计算
     * @author YiDianDian
     */
    public class Area {
    
        public static void main(String[] args) {
            Point point1 = new Point(3,4);
            Point point2 = new Point(5,11);
            Point point3 = new Point(12,8);
            Point point4 = new Point(9,5);
            Point point5 = new Point(5,6);
            List<Point> list = new ArrayList<>();
            list.add(point1);
            list.add(point2);
            list.add(point3);
            list.add(point4);
            list.add(point5);
            System.out.println(getArea(list));	//30
        }
        public static double getArea(List<Point> pointList){
            double area = 0;
            for (int i = 1; i <= pointList.size(); i++) {
                double X = pointList.get(i - 1).x;
                double Y = pointList.get(i - 1).y;
                double nextX = pointList.get(i % pointList.size()).x;
                double nextY = pointList.get(i % pointList.size()).y;
    //            if (i == pointList.size()) {
    //                 nextX = pointList.get(0).x;
    //                 nextY = pointList.get(0).y;
    //            } else {
    //                nextX = pointList.get(i).x;
    //                nextY = pointList.get(i).y;
    //            }
                double temp = X * nextY - nextX * Y;
                area += temp;
            }
            area = Math.abs(area/2.0);
            return area;
        }
    
        @Data
        @Builder(toBuilder = true)
        @AllArgsConstructor
        static class Point {
            private double x;
            private double y;
        }
    }
    
    展开全文
  • 任意多边形面积计算

    热门讨论 2007-07-22 12:04:39
    任意多边形面积计算vb程序,我通过巨大劳动,终于解决了一组经纬度围成的任意多边形的面积计算问题,代码十分简洁,我在网上悬赏(悬偿)求解算法的"告示"从此刻失效,终止承诺:2007-07-20 19:00,.我将程序发布在此,供...
  • 之前尝试过很多的任意多边形截面积计算,都有不同的局限性,直到使用了这个公式后,问题就解决了,感谢原作者的...//任意多边形面积计算 double CLASS_NAME::PolygonAreaCalculation(WeirCoorType *pWeirCoor, WO...

    之前尝试过很多的任意多边形截面积计算,都有不同的局限性,直到使用了这个公式后,问题就解决了,感谢原作者的分享。


    //堰槽坐标定义
    typedef struct  
    {
    	double x;
    	double y;
    }WeirCoorType;

    //任意多边形面积计算
    double CLASS_NAME::PolygonAreaCalculation(WeirCoorType *pWeirCoor, WORD CoorCnt)
    {
    	double sum0 = 0;
    	double square;
    
    	//这个多边形计算代码如此简单,可以计算任意的多边形,就算是弧形都行,只要你输入坐标点就行
    	for (int i = 0; i < CoorCnt - 1; i++)
    	{
    		sum0 += (pWeirCoor[i].x * pWeirCoor[i + 1].y - pWeirCoor[i + 1].x * pWeirCoor[i].y);
    	}
    	square = (fabs(sum0 + (pWeirCoor[CoorCnt - 1].x * pWeirCoor[0].y) - (pWeirCoor[0].x * pWeirCoor[CoorCnt - 1].y))) / 2;
    
    	return square;
    }

    最后测试生成的效果,用于对一个任意河道的不同过水断面进行计算,这个断面就是一个任意多边形。

    代码的核心就是计算多边形面积,以及寻找水位线与断面(多边形)的交点,根据交点获取水位以下河道多边形的坐标。

    这个绿线对应的就是水位与河道形成的多边形,这个公式可以允许2个相连接的多边形,比如上图所示的,水位Y值为15,灰色区域就是河道,没有水的地方,这个多边形计算公式会自动的计算左右2个过水断面的面积。
    //计算交点的X值
    double CLASS_NAME::CalculateIntersectionX(WeirCoorType *pWeirCoor1, WeirCoorType *pWeirCoor2, double y)
    {
    	double ftemp;
    	WeirCoorType *pMaxCoor, *pMinCoor;
    	
    	if (pWeirCoor1->y == pWeirCoor2->y) //Y轴一样,不允许的,随便输出一个X轴
    	{
    		SYS_LOG.Write(__FILE__ + __LINE__ + " \t:不允许2个坐标的Y轴一样\r\n");
    		return pWeirCoor1->x;
    	}
    	else if (pWeirCoor1->y > pWeirCoor2->y)
    	{
    		pMaxCoor = pWeirCoor1;	//Y轴大的点
    		pMinCoor = pWeirCoor2;	//Y轴小的点
    	}
    	else
    	{
    		pMaxCoor = pWeirCoor2;	//Y轴大的点
    		pMinCoor = pWeirCoor1;	//Y轴小的点
    	}
    	if (y >= pMaxCoor->y) return pMaxCoor->x;	//大于大的点
    	if (y <= pMinCoor->y) return pMinCoor->x;	//小于小的点
    	//斜线,并且处于中间
    	ftemp = ((pMaxCoor->y - y) * (pMaxCoor->x - pMinCoor->x)) / (pMaxCoor->y - pMinCoor->y);
    
    	ftemp = pMaxCoor->x - ftemp;
    
    	return ftemp;
    }

    这个函数用于计算水位(一个水平横线)与河道交叉点的X坐标,由于水位是一个Y值,X值就是距离河道边零点的距离,通过这个就可以知道水位与河道的交叉点坐标,也就是水位与河道形成的过水断面多边形的交差坐标。

    通过下面的这个线程就可以不听的计算任意水位对应的过水断面面积,我的做法是人为设置一个分辨率,比如1cm,程序会计算0cm断面面积,1cm水位断面面积,2cm水位断面面积,依次类推。
    //线程-运行核心  
    System::Void CLASS_NAME::BackgroundWorker_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e)
    {
    	double ftemp;
    	double Y_Inc = 0.1;	//Y轴增量
    	WORD i;
    	double X;
    	int Status;
    	WORD count;
    	WORD StartIndex;
    	int n;
    	char buff[32];
    
    	WeirCoorType TempWeirCoor1[256];
    	try
    	{
    		this->VarY = 0;
    		for (n = 0; n < 256; n++)
    		{
    			//WeirCoorType WeirCoor1[9] = { {0,0}, {25,0}, {25,50}, {75,50},{75,0}, {90,0},{100,0}, {100,100},{0,100}};
    
    			//坐标必须按照顺序,从左上角,左下角,右下角,右上角顺序,X轴依次增加,左上角与右上角Y轴相等并且最大
    			//WeirCoorType WeirCoor1[9] = { { 0, 100 }, { 0, 0 }, { 25, 0 }, { 25, 50 }, { 75, 50 }, { 75, 0 }, { 100, 0 }, { 100, 100 }};
    
    			//寻找Y轴交点坐标
    
    			i = 0;
    			count = 0;
    			for (int j = 0; j < this->WeirCoorNum / 2; j++)		//循环寻找交点-一对
    			{
    				//从第一个坐标开始,先寻找Y值对应的X坐标
    				for (; i < (this->WeirCoorNum - 1); i++)
    				{
    					if (this->pWeirCoorBuff[i].y >= this->VarY && this->pWeirCoorBuff[i + 1].y < this->VarY) //左边交点
    					{
    						USER_DEBUG.Printf("左交点:%f,%f~%f,%f\r\n", this->pWeirCoorBuff[i].x, this->pWeirCoorBuff[i].y, this->pWeirCoorBuff[i + 1].x, this->pWeirCoorBuff[i + 1].y);
    
    						//计算交点坐标
    						X = this->CalculateIntersectionX(&this->pWeirCoorBuff[i], &this->pWeirCoorBuff[i + 1], this->VarY);
    						USER_DEBUG.Printf("左交点:(%f,%f)\r\n", X, this->VarY);
    
    						TempWeirCoor1[count].x = X;
    						TempWeirCoor1[count].y = this->VarY;
    						count++;
    						StartIndex = i + 1;
    
    						break;
    					}
    				}
    
    
    				//从第一个坐标开始,先寻找Y值对应的X坐标
    				for (; i < (this->WeirCoorNum - 1); i++)
    				{
    					if (this->pWeirCoorBuff[i].y < this->VarY && this->pWeirCoorBuff[i + 1].y >= this->VarY) //右边交点
    					{
    						USER_DEBUG.Printf("右交点:%f,%f~%f,%f\r\n", this->pWeirCoorBuff[i].x, this->pWeirCoorBuff[i].y, this->pWeirCoorBuff[i + 1].x, this->pWeirCoorBuff[i + 1].y);
    
    						//计算交点坐标
    						X = this->CalculateIntersectionX(&this->pWeirCoorBuff[i], &this->pWeirCoorBuff[i + 1], this->VarY);
    						USER_DEBUG.Printf("右交点:(%f,%f)\r\n", X, this->VarY);
    
    						for (int k = StartIndex; k <= i; k++)
    						{
    							TempWeirCoor1[count].x = this->pWeirCoorBuff[k].x;
    							TempWeirCoor1[count].y = this->pWeirCoorBuff[k].y;
    							count++;
    						}
    
    						TempWeirCoor1[count].x = X;
    						TempWeirCoor1[count].y = this->VarY;
    						count++;
    
    						break;
    					}
    				}
    
    
    
    				if (i >= this->WeirCoorNum - 1) break;
    			}
    
    			this->SelectCoorCount = count;  //选择的点数量
    			memcpy(this->pSelectWeirCoor1, TempWeirCoor1, sizeof(WeirCoorType) * count);
    			this->mBackgroundWorker->ReportProgress(1);	//状态改变
    
    
    			//打印最终的坐标
    			USER_DEBUG.Printf("多边形坐标:");
    			for (i = 0; i < count; i++)
    			{
    				USER_DEBUG.Printf("%f,%f \t", TempWeirCoor1[i].x, TempWeirCoor1[i].y);
    			}
    			USER_DEBUG.Printf("\r\n");
    
    
    
    
    
    
    			//WeirCoorType WeirCoor1[8] = { {0,0}, {100,0}, {100,100},{1,100}};
    
    
    			//任意多边形面积计算
    			ftemp = this->PolygonAreaCalculation(TempWeirCoor1, count);
    
    
    			USER_DEBUG.Printf("面积:%f\r\n", ftemp);
    			this->SectionalArea = ftemp;	//最终的截面积
    			this->SectionalAreaBuff[n] = this->SectionalArea; //截面积写入全局缓冲区中
    
    
    
    			this->VarY += this->VerticalResVal;
    			if (this->VarY > this->pWeirCoorBuff[0].y)
    			{
    				USER_DEBUG.Printf("垂直高度超出范围了,退出!\r\n");
    				break;
    			}
    			Sleep(20);
    		}
    		
    		ftemp = this->SectionalArea;
    		for (; n < 256; n++)	//补充不足256个截面数据,后面截面积固定
    		{
    			this->SectionalAreaBuff[n] = ftemp;
    			ftemp += 0.00001; //截面积只能增大,不能不变,有效位数5位小数自增
    		}
    
    		//生成datatable
    		this->mDataTable->Rows->Clear();	//清空行
    		for (int i = 0; i < 256; i++)		//循环添加行
    		{
    			DataRow ^dr = this->mDataTable->NewRow();//新建行
    			sprintf_s(buff, 31, "%.5f", this->SectionalAreaBuff[i]);
    			dr[0] = CharToString(buff);
    
    
    			this->mDataTable->Rows->Add(dr);//添加行
    
    		}
    
    	}
    	catch (Exception ^e1)
    	{
    		SYS_LOG.Write(__FILE__ + __LINE__ + "\t:" + e1->Message + e1->StackTrace);
    	}
    }
    

    感谢网友分享的任意多边形计算公式,见:https://blog.csdn.net/LemonGirl131/article/details/51130659



    展开全文
  • 不规则封闭多边形面积计算

    热门讨论 2011-07-21 09:39:01
    简单的不规则封闭多边形面积计算方法。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • 经纬度坐标下的球面多边形面积计算公式,这是古人的算法。
  • 界面开发,小程序,面积计算,周长计算,JavaFX Scene Builder 2.0,非常利于刚刚开始学习界面的小白,希望能有所收获,不过要自行安装javafx插件,和JavaFX Scene Builder 2.0。
  • lua学习的一个小应用,通采用面向对象编程的方式实现任意多边形面积计算
  • 多边形面积计算公式

    千次阅读 2015-02-25 11:46:40
    多边形面积公式说明: 我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式  |x1 x2 x3|  为: S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5  多边形的面积公式...
  • 多边形面积公式推导: 使用二维向量求三角形的面积:对于三角形ABC  该题目中,取原点为三角形的一个点。 二维向量的叉乘公式为:  如果A(x1,y1),B(x2,y2),那么S=(x1*y2-x2*y1) / 2   得出多边形的计算公式...
  • 任意多边形面积公式多边形计算公式的计算和原点的选取没有关系,通常可以选点(0,0)或者多边形的第一个点(这个时候比较直观了,看起来就是把多边形分成一个个三角形和加起来,读者自己可以画个图)就可以了。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,024
精华内容 6,009
关键字:

多边形面积计算