this.locateBylonlat=function(featId,lons,lats,extendSelection){
var lonArr=lons.split(',');
var latArr=lats.split(',');
var len=lonArr.length;
var realLen=len-1;
var lon;
var lat;
if(len<=4){
var lonMide=(this.myParseFloat(lonArr[1])+this.myParseFloat(lonArr[2]))/2;
var latMide=(this.myParseFloat(latArr[1])+this.myParseFloat(latArr[2]))/2;
lon=(this.myParseFloat(lonArr[0])+lonMide)/2;
lat=(this.myParseFloat(latArr[0])+latMide)/2;
this.clickRightTree(featId,lon,lat,extendSelection)
}else{
var lonV=this.myParseFloat(lonArr[0]);
var latV=this.myParseFloat(latArr[0]);
var a;
var b;
var index=0;
for(var i=1;i <len-1;i++){ //寻找一个凸顶点,最低点肯定是凸顶点
if(this.myParseFloat(lonArr[i]) <lonV){
lonV=this.myParseFloat(lonArr[i]);
latV=this.myParseFloat(latArr[i]);
index=i;
}
}
a=(index-1+realLen)%realLen; //得到v的前一个顶点
b=(index+1)%realLen; //得到v的后一个顶点
var q;
var latTri=[this.myParseFloat(latArr[a]),this.myParseFloat(latArr[index]),this.myParseFloat(latArr[b])];
var lonTri=[this.myParseFloat(lonArr[a]),this.myParseFloat(lonArr[index]),this.myParseFloat(lonArr[b])];
var md=Number.MAX_VALUE;
var bin=false;
for(var i=0;i <realLen;i++) { //寻找在三角形avb内且离顶点v最近的顶点q
if(i==index)continue;
if(i==(index-1+realLen)%realLen)continue;
if(i==(index+1)%realLen)continue;
if(!this.pnpoly(3,latTri,lonTri,this.myParseFloat(latArr[i]),this.myParseFloat(lonArr[i])))continue;
bin=true;
var distance=this.dist(lonArr,latArr,index,i);
if(distance <md) {
q=i;
md=distance;
}
}
if(!bin){ //没有顶点在三角形avb内,返回线段ab中点
lon1=(this.myParseFloat(lonArr[a])+this.myParseFloat(lonArr[b]))/2;
lat1=(this.myParseFloat(latArr[a])+this.myParseFloat(latArr[b]))/2;
lon=(this.myParseFloat(lonArr[index])+lon1)/2;
lat=(this.myParseFloat(latArr[index])+lat1)/2;
}else{
lon=(this.myParseFloat(lonArr[index])+this.myParseFloat(lonArr[q]))/2; //返回线段vq的中点
lat=(this.myParseFloat(latArr[index])+this.myParseFloat(latArr[q]))/2;
}
this.clickRightTree(featId,lon,lat,extendSelection)
}
}
this.myParseFloat=function(num){
return OpenLayers.Util.toFloat(num);
}
this.dist=function(lonArr,latArr,i,j){
var num1=(lonArr[i]-lonArr[j])*(lonArr[i]-lonArr[j]);
var num2=(latArr[i]-latArr[j])*(latArr[i]-latArr[j]);
return Math.sqrt(num1+num2);
}
//google的判断点在不在多边形区域内
this.pnpoly=function(nvert, vertx, verty,testx,testy)
{
var i, j, c = false;
for (i = 0, j = nvert-1; i < nvert; j = i++) {
if ( ((verty[i]>testy) != (verty[j]>testy)) &&
(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
c = !c;
}
return c;
}
分享到:
相关推荐
在Java编程中,判断一个点是否位于多边形区域内是一个常见的地理空间运算问题。这个问题在地图应用、GIS(地理信息系统)以及游戏开发等领域有广泛的应用。以下是对这个知识点的详细阐述: 1. **坐标系统与投影**:...
在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...
该方法基于一个几何事实:如果你从空间中的任意一点向任意方向画一条射线,这条射线将与凸多边形的边界交于偶数次,而与凹多边形的边界交于奇数次(不包括起点和终点)。通过计算这个交点数,我们可以确定点是否在...
java判断某个点是否在所画多边形或圆形内 在计算机图形学和 GIS 领域中,判断某个点是否在所画多边形或圆形内是一个常见的问题。java语言提供了多种方法来解决这个问题。本文将详细介绍java判断某个点是否在所画...
在计算机图形学中,多边形填充是一种基本的算法,用于在屏幕上绘制封闭的多边形内部区域。QT是一个流行的跨平台应用程序开发框架,它提供了丰富的图形用户界面(GUI)功能,包括支持自定义图形绘制。本文将详细介绍...
### Python随机生成均匀分布在三角形或任意多边形内的点 #### 一、背景与应用场景 在计算机图形学、统计学、数据可视化等领域,经常需要生成位于特定几何形状内部的随机点,例如三角形或多边形。这些随机点通常...
有多种方法可以实现这一点,如Ear Clipping法、分而治之的三角剖分算法等。这些方法通常涉及找到合适的边来切割梯形,使得生成的三角形满足非交叉、内部不包含其他顶点的条件。 4. **后处理**:在所有梯形三角化...
6. 最后,保留所有在裁剪区域内的边和点,形成新的多边形。 在VS2008工程中,我们需要设置OpenGL上下文,编写相应的顶点和片段着色器代码,并将裁剪算法逻辑实现为GLSL(OpenGL Shading Language)程序。此外,还...
逐点判断算法是对屏幕上的每个像素进行判断,确定它们是否在多边形区域内部,从而求出位于多边形区域内的像素的集合。逐点判断算法可以使用射线法和弧长法来实现。 射线法是将射线从一点出发,计算它与多边形边界的...
它将平面分割成多个区域,使得每个区域内任意一点到其对应的生成点的距离,都小于到其他任何生成点的距离。这些区域就是泰森多边形,而生成点通常称为种子点或站点。 在提供的压缩包中,包含了一系列与泰森多边形...
大家都知道MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。 1.使用百度拾取坐标工具,在地图上定义多边形的坐标...
一旦知道区域内任意一点的内外关系,就可以确定整个区域的梯形归属。 2. 扫描线连贯性:这是区域连贯性在单条扫描线上的体现,意味着在一条扫描线上,多边形的入点和出点之间的所有点都属于多边形内部。 3. 边的...
- **自由矢量**:从一个多边形的任意一点指向另一个点的矢量,它不依赖于起点。 - **绝对矢量**:指从多边形的某个固定点出发到另一个点的矢量,起点固定。 #### 三、算法原理 为了找到简单多边形的最小外接矩形,...
它们是搜索方向的问题,从区域内任意一点出发,如果只是通过上、下、左、右四个方向搜索到达区域内的任意像素,则用这种方法填充的区域就称为四连通域,这种填充方法就称为“4-联通算法”。如果从区域内任意一点出发...
在三角形内,我们可以使用Barycentric坐标来确定每个像素相对于三角形三个顶点的位置,进而进行颜色插值。 接下来,遍历多边形内部的所有像素,计算它们的Barycentric坐标。这些坐标可以用来线性插值三角形三个顶点...
区域的连续性是指区域内的一点与多边形的位置关系,即可确定该区域内所有点与多边形之间的内外关系。扫描线的连续性是区域连续性在扫描线上的体现,即扫描线与多边形的边界的交点序列具有偶数个元素。边的连续性是指...
区域填充算法是计算机图形学中的一种常用技术,用于将多边形区域内的所有像素点赋予指定的颜色。基于 C 语言的区域填充算法的实现是指使用 C 语言编写的区域填充算法程序,该算法可以高效地实现多边形的区域填充。 ...
### JavaScript 判断点是否在多边形区域内 在JavaScript编程中,经常需要处理与图形相关的逻辑,例如判断一个点是否位于一个多边形内部。这种需求常见于地图应用、游戏开发等场景。本文将详细介绍一种经典的算法...
接下来,为了使按钮只在多边形区域内响应触摸事件,MZShapedButton可能重写了`hitTest:withEvent:`方法。这个方法是UIResponder类的一部分,用于确定视图是否应该接收特定的触摸事件。通过在该方法中加入自定义的...