如何获取多边形坐标面积公式每个点的坐标,在线等

1159人阅读
算法(61)
参考/armyfai/p/3529243.html
1,将多边形的坐标存在在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个值minX,maxX,minY,maxY,算出一个四边形,判断目标点是否在这个四边形内,不满足,直接返回false,证明该目标点不在此多边形内部。
if(m_Pos.x & minX || m_Pos.x & maxX || m_Pos.y & minY || m_Pos.y & maxY)
2,然后,在多边形所规定的平面上,随便定义一个点,之后通过该点水平画一条线,数数这条横线和多边形的边相交多少次,看这条横线穿越多边形的次数是否为奇数,若为奇数,那么该目标点在多边形内,若为偶数,则在多边形外。
// vert 代表多边形有几个点,testx, testy 代表待测目标点的坐标,*vertx, *verty分别指向储存多边形横纵坐标数组的首地址
// 每次计算都涉及到相邻的两个点和待测试点,然后考虑两个问题:
// 1 被测试点的纵坐标是否在本次循环所测试的两个相邻点纵坐标范围之内?
// verty[i] & testy & vert[j] 或者 vert[j] & testy & vert[i]
// 2, 待测点是否在i,j两点之间的连线之下?
// 斜率公式,几何和不等式
//&然后每次这两个条件同时满足的时候我们把返回的布尔量取反。
int fun(int vert, float *vertx, float *verty, float testx, float testy)
int i, j, c = 0;
for (i = 0, j = vert-1; i & j = i++)
if ( ( (verty[i]&testy) != (verty[j]&testy) ) &&
(testx & (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:85706次
积分:3567
积分:3567
排名:第7144名
原创:217篇
转载:368篇
评论:87条
阅读:1130
文章:38篇
阅读:7404
(1)(4)(25)(80)(71)(18)(9)(20)(107)(7)(9)(28)(11)(12)(8)(13)(58)(34)(40)(10)(22)1129人阅读
C/C++(19)
受到在线变成QQ群讨论的一个问题启发,“如何判断点是否在三角形内部?”
  给定一个平面直角坐标系和一组数据,数据由一系列坐标点组成,形式如:(xi, yi),i = 1, 2, 3……, 给定的(xi, yi)可以组成一个封闭的多边形,数组下标顺序连接点坐标,(x0, y0) -& (x1, y1) -& ……-&(xn-1, yn-1) -&(x0, y0),现在给定一个坐标点(X, Y),请判断该点的位置:返回 1 表示在多边形内部,返回 0
表示在多边形边上,返回 -1 表示在多边形外部。
思路1:分割法
& & & & &假设n = 3, (xi, yi),i=1,2,3; 三个点坐标为(0, 0), (0, 1), (1, 0),那么该三角形围成的三条直线的解析式分别为:y = 0; &x = 0; &y = -x + 1;还记得高中时我们学的不等式方程吗,如图所示:
如果点(X0, Y0)在上图中封闭的三角形内部,那么满足三个不等式:
X0 & 0; Y0 & 0; X0 + Y0 -1 & 0; 若在三角形边上则是三个不等式转换为相应的等式:
X0 = 0; Y0 = 0; X0 + Y0 -1 = 0; 其余情况则是点在三角形外部;
通过上面两个例子,解析式用aixi + biyi + ci = 0表示,可以得到结论,则有当n 为3时,满足三个对应的不等式。
  在解题的过程中,发现对于任意多边形来说,需要讨论的情况太复杂,所以在这里我们假设该多边形是一个凸多边形。所谓凸多边形,就是把一个多边形任意一边向两方无限延长成为一条直线,如果多边形的其他各边均在此直线的同旁,那么这个多边形就叫做凸多边形。
  在多边形内部找到一个相对合适的参照坐标点(X, Y),以该点为中心,分别与多边形各点连接,形成n个独立的三角形,通过上面对点与三角形位置判断的理论,可以分n次判断该点是否在分割的n个独立的三角形内部即可;如下图所示:
找到比较合适的点的方法是:在任意两个内角之间,作这两个内角的角平分线,角平分线的交点的坐标就是我们所要找的参照点。
  正当我要实现其代码时,在网上发现了一个更加简洁的解决方法,并且,此方法对于多边形没有限制,适用于任意多边形的情况。
思路2:向量叉积法
设矢量P = (x1,y1) ,Q = (x2,y2)
  则矢量叉积定义为: &P × Q = x1*y2 – x2*y1 & 得到的是一个标量
  显然有性质 P × Q = – ( Q × P ) & P × ( – Q ) = – ( P × Q )
  如不加说明,下面所有的点都看作矢量,点的乘法看作矢量叉积;
叉乘的重要性质:
  若 P × Q && 0 , &则P 在Q的顺时针方向
  若 P × Q && 0 , &则P 在Q的逆时针方向
  若 P × Q &= 0 , &则P 与Q共线,但可能同向也可能反向 ,用于判断点是否在边上
对于(x0, y0), (x1, y1), ……, (xn - 1, yn - 1)这些坐标,若(xk, yk)指向(xk + 1, yk + 1)的矢量为Vk ,(xk, yk)指向(X, Y)的矢量为Vf ,对于所有的k = 0, 1, 2……,n - 1,当k = n - 1时,Vn- 1 (xn - 1, yn - 1)指向(x0, y0)
1、任意一点(xk, yk)使得Vf若为(0, 0)零向量,则点在多边形上;
2、若满足Vf在Vk的同一方向(均为逆时针或者顺时针方向),即都满足P × Q && 0(顺时针为P × Q && 0),则点(X, Y)在该多边形内部;
3、若不在同一方向且Vf和Vk永远不共线,则在多边形外部;
4、若Vf和Vk存在共线情况,则判断使得Vf和Vk共线的点(X, Y)是否在多边形上(Vf &。Vk &&0 且|Vf | & |Vk|则点(X, Y)在多边形边上),其他则在外部。
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
//返回1表示内部,0表示边上,-1表示外部
int dotLocation(const double *x, const double *y, int n, const double XG, const double YG)
int currentflag = 0;
//当前状态,根据每次叉乘的值来判断
int lastflag = 0;
//只在第一次进入循环式赋值,后面依次比较lastflag和currentflag的关系
int iterN = 0;
double vectorPX = 0.0, vectorPY = 0.0;
double vectorQX = 0.0, vectorQY = 0.0;
double PRODUCT = 0.0;//叉乘
for(iterN = 0; iterN & iterN++)
vectorPX = XG - x[iterN];
vectorPY = YG - y[iterN];
if(vectorPX == 0 && vectorPY == 0) return 0;
//要检测的点若在数组x, y中,表示该点在多边形上
vectorQX = x[(iterN == n - 1) ? 0 : (iterN + 1)] - x[iterN];
vectorQY = y[(iterN == n - 1) ? 0 : (iterN + 1)] - y[iterN];
PRODUCT = vectorPX * vectorQY - vectorQX * vectorPY;//计算叉乘
currentflag = ( PRODUCT & 0) ? 1 : ((PRODUCT & 0)? -1 : 0);//判断叉乘获取currentflag的值
if(iterN == 0)//第一次进入循环
lastflag =
if(currentflag != lastflag)
switch(currentflag)
//叉乘为0时,共线(反向货同向),要分两种情况:1、点在边上;2、点在外部
return (vectorPX * vectorQX + vectorPY * vectorQY & 0 && (vectorPX * vectorPX + vectorPY * vectorPY) &= (vectorQX * vectorQX + vectorQY * vectorQY))? 0 : -1;
return -1;//点在多边形外部
//点在多边形内部
int main()
double x[3] = { 0.0, 0.0, 1.0 };
double y[3] = { 0.0, 1.0, 0.0 };
int n = 3;
double X , Y;
double x[4] = { 0.0, 0.0, 1.0, 1.0 };
double y[4] = { 0.0, 1.0, 1.0, 0.0 };
int n = 4;
double X , Y;
int result = dotLocation(x, y ,n, X ,Y);
printf(&the result is %d\n&, result);
switch(result)
case 0: printf(&该点在多边形的边上!\n&);
case 1: printf(&该点在多边形的内部!\n&);
case -1: printf(&该点在多边形的外部!\n&);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:88901次
积分:1117
积分:1117
排名:千里之外
原创:23篇
评论:246条
(1)(2)(1)(3)(15)(1)已知任意多边形每个点坐标,求多边形面积?
尛辰°丶618
  对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:  S(A1,A2,A3,、、、,An)  = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))  P是可以取任意的一点,用(0,0)时就是下面的了:  设点顺序 (x1 y1) (x2 y2) ... (xn yn)  则面积等于  |x1 y1| |x2 y2| |xn yn|  0.5 * abs( | | + | | + . + | | )  |x2 y2| |x3 y3| |x1 y1|  其中  |x1 y1|  | |=x1*y2-y1*x2  |x2 y2|  因此面积公式展开为:  |x1 y1| |x2 y2| |xn yn|  0.5 * abs( | | + | | + . + | | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)  |x2 y2| |x3 y3| |x1 y1|
为您推荐:
其他类似问题
可以将多边形分解为多个三角形进行加和。
扫描下载二维码matlab求边界点的坐标编一个函数,输入量是X 表示多边形顶点坐标在多边形的所有边上进行均分(比如每条边都是2等分),找到分点的坐标输出 所有定点和边界点的坐标比如:输入一个正方形
[0 0;1 0;1 1;0 1]输出就应该是 [0 0;0.5 0;1 0;1 0.5;1 1;0.5 1;0 1;0 0.5]矩阵内元素的顺序可以不考虑
吖有蚊子096
&&&aa&=&&&&&0&&&&&0&&&&&1&&&&&0&&&&&1&&&&&1&&&&&0&&&&&1&&&insertval&=&(&a(&1&:&end,&:&)&+&a(&[&2&:&end,&1&],&:&)&)&*&0.5insertval&=&&&&0.5000&&&&&&&&&0&&&&1.0000&&&&0.5000&&&&0.5000&&&&1.0000&&&&&&&&&0&&&&0.5000&&&b&=&ones(&2&*&length(&a&),&2&)b&=&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&b(&1&:&2&:&end,&:&)&=&ab&=&&&&&0&&&&&0&&&&&1&&&&&1&&&&&1&&&&&0&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&1&&&&&0&&&&&1&&&&&1&&&&&1&&&b(&2&:&2&:&end,&:&)&=&insertvalb&=&&&&&&&&&0&&&&&&&&&0&&&&0.5000&&&&&&&&&0&&&&1.0000&&&&&&&&&0&&&&1.0000&&&&0.5000&&&&1.0000&&&&1.0000&&&&0.5000&&&&1.0000&&&&&&&&&0&&&&1.0000&&&&&&&&&0&&&&0.5000
我那个只是举例,正方形只是一个特例。我希望得到一个多边形的边界点的坐标。这个函数对五边形等多边形都适用,只需要输入边界点的坐标,就可以得到边界点坐标的那种。最好能用m文件
我已经写的很清楚了,你只要把a当做m文件function的输入参数就可以了,后面的直接照抄。function b = caledge( a )..........
为您推荐:
扫描下载二维码请教大神如何获取多边形每个点的坐标,在线等_百度地图api吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:5,388贴子:
请教大神如何获取多边形每个点的坐标,在线等收藏
3D双端东方魔幻网游「大青云」勾魂公测,穿越逆转,封神故事,全新演绎!
1 画的过程中可以取到。2 知道坐标也可以画。3 给一个已经画好的图形,api没有这样的参数 你问问其他大神吧
调用Polygon.getPath()
//返回多边型的点数组稍微麻烦的是如何获得你想要的Polygon对象,因为Polygon没有ID属性解决的办法有两种:1、给Polygon添加事件,Polygon.getPath()及其它操作代码写在事件中2、添加Polygon时把ID按一定规则赋值到Polygon的属性,如strokeOpacity//初始化PolygonsecRingPolygon1 = new BMap.Polygon(points, {
strokeColor : &blue&,
fillColor:&#FFF&,
strokeWeight : 0.9,
strokeOpacity : 1-Number(id/1000)
});//调用指定的Polygon
var Overlays=map.getOverlays();
for(i=0;i&Overlays.i++)
if(Overlays[i] instanceof BMap.Polygon)
i f(Math.round((1-Overlays[i]..getStrokeOpacity())*1000)==id)
Overlays[i].setFillColor(&#00F&);;
Overlays[i].setFillColor(&#FFF&);
覆盖物类/Polygon上面说的对。
我回家也查了查你看看这个链接吧上面有。
我做出来了 你加我qq
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 已知坐标求多边形面积 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信