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选择不记录任何这种类型的数据,那么它就无法区分内存里某个位置上的数据到 ...
随机推荐
- ACM1001:Sum Problem
Problem Description In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input ...
- java第一天!
public class Main { public static void main(String[] args)//main主函数 { final double PI=3.14;//定义常量,小数 ...
- 关于DFS与BFS
DFS(深度优先搜索) 为无向图 DFS的过程类似于树的先序遍历. 请看图: DFS此图的过程为: 1.首先任意找一个未被便利过的顶点,例如从V1开始,由于率先访问了它,所以需要标记V1即已经访问 ...
- Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式
一.组合 ''' 1.什么是组合 组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象 2.为何用组合 组合也是用来解决类与类直接代码冗余问题的 3.如何用组合 ''' # 继承减少代 ...
- $.ready和onload 区别
1.jq ready()的方法就是Dom Ready 他的作用或者意义就是:在DOM加载完成后就可以可以对DOM进行操作. 一般情况先一个页面响应加载的顺序是,域名解析-加载html-加载js和css ...
- 微信小程序中的分享事件
小程序的分享 onShareAppMessage(options) 在页面的js文件中定义了 onShareAppMessage 函数时,页面可以表示改页面可以转发.可以在函数中设置页面转发的信息 ...
- SpringBoot实现监听redis key失效事件
需求: 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 解决方案1: 可以利用redis天然的key自动过期机制,下单时将订单id写入redis,过期时间30分钟,30分钟后检查订单状态 ...
- halcon算子之tuple_gen_const,用于生成特定长度的元组并且初始化其元素
原文地址:http://blog.sina.com.cn/s/blog_d38f8be50102wczk.html 函数原型: tuple_gen_const(: : Length, Const : ...
- 微信小程序video视频组件
支持mp4和m3u8的视频格式,其中mp4的需要是h264的视频编码 .1.如果您使用video组件是mp4的但不能播放,大部分是由于编码的问题,当然排除文件不存在等这些客观的因素条件.2.如果使用m ...
- LimeSDR在windows下使用Gqrx来接收FM广播
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 LimeSDR链接:https://item.taobao.com/item.htm?spm=a230r.1 ...