多边形面积的计算 在线 高手帮忙计算下面积 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 下面是我用的,对凸多边形和凹多边形都适合。#include "stdafx.h"#include <afx.h>typedef struct tagPoint{ double x; double y;}FPoint;double CalArea(double x[], double y[], long pointNum){ if(pointNum<3)return 0; double sum = 0; int m = 1; for(;;) { if(pointNum < 3)break; FPoint r1; r1.x = x[m] - x[0]; r1.y = y[m] - y[0]; FPoint r2; r2.x = x[m+1] - x[m]; r2.y = y[m+1] - y[m]; sum += (r1.x * r2.y - r2.x * r1.y); m++; pointNum --; } double result = (sum>0)?(sum/2.):(-sum/2.); return result;} 做一个黑笔 CPen(PS_SOLID, 1, (COLORREF)0X00000000);做一个黑刷 CBrush((COLORREF)0X00000000);把多边形的各个角点存到数组 POINT Points[];调用折线绘图 BOOL Polygon( LPPOINT lpPoints, int nCount );数一下DC中黑点的个数 GetPixel(x,y);--------------------------------------------------------个数 = 面积。这是个很经典的做法。 发表于:2009-07-08 10:01:4110楼 得分:0 下面是我用的,对凸多边形和凹多边形都适合。 你是把多边形以x0 y0分为n-2个三角对吧 那样 算不了像 边是不规则锯齿状的多边形呀 以四个顶点为例 (x1,y1)(x2,y2)(x3,y3)(x4,y4)面积 S = 0.5 * { (x1+x2)(y2-y1) + (x2+x3)(y3-y2) - (x3+x4)(y3-y4) - (x4+x1)(y4-y1) }整理后为 S = 0.5 * { (x1*y2 - x2*y1) + (x2*y3 - x3*y2) + (x3*y4 - x4*y3) + (x4*y1 - x1*y4) } 嗯。。是的。。但是用整理后的公式就不用判断了。。std::vector<CPoint> m_vPoint; // 存放各顶点坐标double CalArea(CPoint Pt1,CPoint Pt2){ return Pt1.x*Pt2.y-Pt2.x*Pt1.y; }double dArea = 0;int iNum = (int)m_vPoint.size();for( int i = 0; i < iNum-1; i++ ){ dArea += 0.5*CalArea(m_vPoint[i], m_vPoint[i+1]);}dArea += 0.5 * CalArea(m_vPoint[iNum-1], m_vPoint[0]);dArea = abs(dArea); 呵呵 比较笨 Pt1.x*Pt2.y-Pt2.x*Pt1.y 看不懂 怎么象在做行列式 用的CPoint类型,Pt1.x*Pt2.y-Pt2.x*Pt1.y其实就相当于 x1*y2 - x2*y1等等。。 恩 我看懂了 你那是有行列式算(x1,y1)(x2,y2)两个向量为边的四边形 是吧 命令消息与通知消息,如何界定呀?都是产生 WM_COMMAND 消息呀? 如果处理没有imagelist的树的拖动问题? 得不到API函数地址,奇怪! 一个简单问题,送分 惊人大秘密: 中国人必看 转帖 请专家:当用户的屏幕显示发生任何变化的时候,我想得到一个事件。 【贺】晋升五星,再次散分 【再次贺】 关于托盘的2个问题,以前的帖子中没有解答的。 来者有分 USB 用CreateFile()打开usb设备时,如何填写devicepath这个值? MFC里面基于对话框的程序和SDI程序的区别是? 求助:MFC操作Word时,所有的类都不能用
#include <afx.h>
typedef struct tagPoint
{
double x;
double y;
}FPoint;
double CalArea(double x[], double y[], long pointNum)
{
if(pointNum<3)return 0;
double sum = 0;
int m = 1;
for(;;)
{
if(pointNum < 3)break;
FPoint r1;
r1.x = x[m] - x[0];
r1.y = y[m] - y[0];
FPoint r2;
r2.x = x[m+1] - x[m];
r2.y = y[m+1] - y[m];
sum += (r1.x * r2.y - r2.x * r1.y);
m++;
pointNum --;
}
double result = (sum>0)?(sum/2.):(-sum/2.);
return result;
}
做一个黑刷 CBrush((COLORREF)0X00000000);
把多边形的各个角点存到数组 POINT Points[];
调用折线绘图 BOOL Polygon( LPPOINT lpPoints, int nCount );
数一下DC中黑点的个数 GetPixel(x,y);
--------------------------------------------------------
个数 = 面积。
这是个很经典的做法。
下面是我用的,对凸多边形和凹多边形都适合。
你是把多边形以x0 y0
分为n-2个三角对吧 那样 算不了像 边是不规则锯齿状的多边形呀
std::vector<CPoint> m_vPoint; // 存放各顶点坐标
double CalArea(CPoint Pt1,CPoint Pt2){ return Pt1.x*Pt2.y-Pt2.x*Pt1.y; }double dArea = 0;
int iNum = (int)m_vPoint.size();for( int i = 0; i < iNum-1; i++ )
{
dArea += 0.5*CalArea(m_vPoint[i], m_vPoint[i+1]);
}dArea += 0.5 * CalArea(m_vPoint[iNum-1], m_vPoint[0]);
dArea = abs(dArea);
呵呵 比较笨 Pt1.x*Pt2.y-Pt2.x*Pt1.y 看不懂 怎么象在做行列式