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# 判断两条线段是否相交(判断地图多边形是否相交)的更多相关文章

  1. 计算几何--判断两条线段相交--poj 2653

    Pick-up sticks Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8862   Accepted: 3262 De ...

  2. Pick-up sticks(判断两条线段是否相交)

    Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8351 Accepted: 3068 Description Stan has ...

  3. [CSharpTips]判断两条线段是否相交

    判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...

  4. 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)

    转载自 http://blog.csdn.net/william001zs/article/details/6213485 矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果 ...

  5. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  6. ACM1558两线段相交判断和并查集

    Segment set Problem Description A segment and all segments which are connected with it compose a seg ...

  7. 平面内,线与线 两条线找交点 两条线段的位置关系(相交)判定与交点求解 C#

    个人亲自编写.测试,可以正常使用   道理看原文,这里不多说   网上找到的几篇基本都不能用的   C#代码 bool Equal(float f1, float f2) { return (Math ...

  8. javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数

    javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...

  9. JVM-如何判断一段数据是真正的数据,还是对象的引用

    JVM 判断一段数据到底是数据还是引用类型,首先要看JVM选择用什么方式.通常这个选择会影响到GC的实现. 一.保守式 如果JVM选择不记录任何这种类型的数据,那么它就无法区分内存里某个位置上的数据到 ...

随机推荐

  1. Openssl自建CA

    查看证书相关指令 # 查看公钥数字证书 openssl x509 -in cacert.pem -noout -text # 查看私钥数字证书 openssl pkcs12 -in client-ce ...

  2. 20155305mypwd的实现和测试

    20155305mypwd的实现和测试 pwd命令及其功能 命令格式: pwd 命令功能: 查看"当前工作目录"的完整路径 常用参数: 一般情况下不带任何参数 作业mypwd代码实 ...

  3. 单调性优化DP

    单调性优化DP Tags:动态规划 作业部落链接 一.概述 裸的DP过不了,怎么办? 通常会想到单调性优化 单调队列优化 斜率优化 决策单调性 二.题目 [x] 洛谷 P2120 [ZJOI2007] ...

  4. 【转载】基于MFC的ActiveX控件开发(2)

    原文:http://iysm.net/?p=118 2.生成并测试控件 好,现在我们就可以先来生成一下这个项目,当然到目前我们只是用系统自动生成的一个控件项目,什么功能都没有,只是一个空框架. 几秒钟 ...

  5. windows7 64位机上配置支持GPU版(CUDA7.5)的OpenCV2.4.13操作步骤

    很久之前在windows7 32位上配置过GPU版的opencv,可参考http://blog.csdn.net/fengbingchun/article/details/9831837 Window ...

  6. Laravel 跨框架队列交互

    公司大部分项目是laravel框架,但有些是yii框架,这两个框架之间有消息需要通信,比如在yii框架发布消息,laravel框架中的队列去处理,用redis作为消息连接纽带 laravel 队列原理 ...

  7. 实战中的asp.net core结合Consul集群&Docker实现服务治理

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...

  8. 菜鸟vimer成长记——第2.2章、visual模式

    vi是没有可视模式的.然而大多数编辑软件都都是有可视模式.所以我猜测vim是几乎迫于无奈才有了visual模式. 个人建议,能不用就不用.这样能直接在头脑里处理好文本,锻炼文本处理能力,同时能转变过来 ...

  9. mysql mtr写入数据

    BEGIN; --disable_query_log --let $rows= 100 WHILE($rows) { --eval INSERT INTO t1 (a) VALUES ( $rows ...

  10. 【厚积薄发】Crunch压缩图片的AssetBundle打包

    这是第133篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...