c# 判断两条线段是否相交(判断地图多边形是否相交)
private void button1_Click(object sender, EventArgs e)
{
//var result = intersect3(point1, point2, point3, point4);
var strPoints = this.txtPoints.Text.Trim(); //数据库复制出来的经纬度字符串
strPoints = strPoints.Substring(0, strPoints.Length - 1);
var pointArr = strPoints.Split(';');
var lineList = new List<MapLine>();
for (int i = 0; i < pointArr.Length; i++)
{
//y 经度 //x 纬度
var line = new MapLine();
string[] tempPoint1 = pointArr[i].Split(',');
line.Point1 = new MapPoint() {y = Convert.ToDouble(tempPoint1[0]), x = Convert.ToDouble(tempPoint1[1])}; string[] tempPoint2;
if (i == pointArr.Length - 1)
{
tempPoint2 = pointArr[0].Split(',');
}
else
{
tempPoint2 = pointArr[i + 1].Split(',');
}
line.Point2 = new MapPoint() {y = Convert.ToDouble(tempPoint2[0]), x = Convert.ToDouble(tempPoint2[1])};
lineList.Add(line);
}
bool xj = false;
for (var i = 0; i < lineList.Count; i++)
{
var count = 0;
for (var j = 0; j < lineList.Count; j++)
{
if (i == j)//如果等于自己,不比较
continue;
var result = intersect(lineList[i].Point1, lineList[i].Point2, lineList[j].Point1,
lineList[j].Point2);
if (result)
{
count++;
}
}
if (count > 2)
{
xj = true;
}
}
MessageBox.Show(xj ? "相交" : "不相交");
} //叉积
double mult(MapPoint a, MapPoint b, MapPoint c)
{
return (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y);
} //aa, bb为一条线段两端点 cc, dd为另一条线段的两端点 相交返回true, 不相交返回false
bool intersect(MapPoint aa, MapPoint bb, MapPoint cc, MapPoint dd)
{
if (Math.Max(aa.x, bb.x) < Math.Min(cc.x, dd.x))
{
return false;
}
if (Math.Max(aa.y, bb.y) < Math.Min(cc.y, dd.y))
{
return false;
}
if (Math.Max(cc.x, dd.x) < Math.Min(aa.x, bb.x))
{
return false;
}
if (Math.Max(cc.y, dd.y) < Math.Min(aa.y, bb.y))
{
return false;
}
if (mult(cc, bb, aa) * mult(bb, dd, aa) < 0)
{
return false;
}
if (mult(aa, dd, cc) * mult(dd, bb, cc) < 0)
{
return false;
}
return true;
}
strPoints
例如 106.549238056551,29.5682761629536;106.544257083204,29.5651964736277;106.550028675985,29.5651166254344;106.544602513089,29.5681623774632;
c# 判断两条线段是否相交(判断地图多边形是否相交)的更多相关文章
- 计算几何--判断两条线段相交--poj 2653
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8862 Accepted: 3262 De ...
- Pick-up sticks(判断两条线段是否相交)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8351 Accepted: 3068 Description Stan has ...
- [CSharpTips]判断两条线段是否相交
判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...
- 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)
转载自 http://blog.csdn.net/william001zs/article/details/6213485 矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果 ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- ACM1558两线段相交判断和并查集
Segment set Problem Description A segment and all segments which are connected with it compose a seg ...
- 平面内,线与线 两条线找交点 两条线段的位置关系(相交)判定与交点求解 C#
个人亲自编写.测试,可以正常使用 道理看原文,这里不多说 网上找到的几篇基本都不能用的 C#代码 bool Equal(float f1, float f2) { return (Math ...
- javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数
javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...
- JVM-如何判断一段数据是真正的数据,还是对象的引用
JVM 判断一段数据到底是数据还是引用类型,首先要看JVM选择用什么方式.通常这个选择会影响到GC的实现. 一.保守式 如果JVM选择不记录任何这种类型的数据,那么它就无法区分内存里某个位置上的数据到 ...
随机推荐
- Installation failed: Timeout was reached: Operation timed out after 10000 milliseconds with 0 out of 0 bytes received
Trying this option worked for me. library(httr) with_config(use_proxy(...), install_github(...)) OR ...
- C语言第四次实验
这次实验共计7道题目 以下代码亲测无误 1.用选择排序法,键盘输入10个整数,对10个整数进行排序(升序) 1.第一种思路就是常规思路,输入--排序--输出 源代码如下: //常规思路,输入,排序,输 ...
- 一维码Code 39简介及其解码实现(zxing-cpp)
一维码Code 39:由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. Code 39码特点: 1. 能够对任意长度的数据进行编码,其局限在于印刷品的长度和条码阅读器的识别 ...
- 9 README,全套代码
BBS+ BLOG系统(仿博客园) 一.概要 欢迎您使用该BBS+BLOG系统,希望在您使用的过程中体验到便捷和愉快的使用感受,并对我们的软件提出您发现的问题和建议,谢谢. 联系邮箱:liangshu ...
- angularJs中缓存数据,免去重复发起请求的几种写法
带缓存处理的两种写法 过程:点击button触发load()方法,请求数据成后显示到页面中.如果已经请求过则从缓存中读取. 在线浏览 写法1: function demo(){ if (demo.ca ...
- Webpack之Code Splitting 代码分块
如何实现代码分块 默认情况webpack会将资源文件打包成一个js文件,比如app.bundle.js 实际情况我们需要按需加载 方法如下: require.ensure(dependencies, ...
- cogs1889 [SDOI2008]Cave 洞穴勘测 link-cut tree
link-cut tree // It is made by XZZ #include<cstdio> #include<algorithm> #define il inlin ...
- Package设计2:增量更新
SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 一般来说,ETL实现增量更新的方式有两种,第一 ...
- AgileRepository - 一个基于接口的Repository快速开发库
AgileRepository 这是一个可以帮助你快速开发Repository的lib.有点像SpringData JPA根据方法名.注解来自动生成查询方法的功能. 对于一些简单的查询,只需要定义接口 ...
- stringObject.substring(start,stop)
用于提取字符串中 介于两个指定下标之间的字符. start 必需.一个非负的整数 stop 可选.一个非负的整数