mysql判断坐标在区域_判断一个点是否在某个区域内(多边形)

判断一个点是否在某个区域内(多边形)背景:比如滴滴会根据乘客所在的不同区域,给出不同的价格。市区堵一点,那么价格也高点。获取服务范围只规定在某个范围内原理:求解从该点向右发出的水平线射线与多边形各边的交点,当交点数为奇数,则在内部。不过要注意几种特殊情况:1、点在边或者顶点上;2、点在边的延长线上;3、点出发的水平射线与多边形相交在顶点上源代码:Point类-多边形顶点的封装类如坐标(166.3,18.4)Line类-多边形对应的各个边的封装类,如{(166.3,18.4), (166.9,19)}MapUtil类-地图公共处理类package com.qj.book.util;/*** Created by xsm48563 on 2017/10/31.* 点*/public class Point {/*** 水平方向值/经度*/public Double X;/*** 垂直方向值/纬度*/public Double Y;Point(Double x, Double y) {x = x == null ? 0:x;y = y == null ? 0:y;this.X = x;this.Y = y;}public boolean equals(Object obj) {// 如果为同一对象的不同引用,则相同if (this == obj) {return true;}// 如果传入的对象为空,则返回falseif (obj == null) {return false;}if (obj instanceof Point) {Point point = (Point) obj;if (point.X.equals(this.X) && point.Y.equals(this.Y)) {return true;} else {return false;}} else {return false;}}public static void main(String[] args) {Point A = new Point(1d, null);Point B = new Point(null, 3d);System.out.println(A.equals(B));}}package com.qj.book.util;import java.math.BigDecimal;/*** Created by xsm48563 on 2017/10/31.* 线*/public class Line {/*** 端点1*/public Point POINTA;/*** 端点2*/public Point POINTB;Line(Point pointA, Point pointB) {this.POINTA = pointA;this.POINTB = pointB;}/*** 判断当前线段是否包含给定的点* 即给定的点是否在当前边上* @param point* @return*/public boolean isContainsPoint(Point point) {boolean result = false;//判断给定点point与端点1构成线段的斜率是否和当前线段的斜率相同//给定点point与端点1构成线段的斜率k1Double k1 = null;if (point.X.equals(this.POINTA.X)) {k1 = Double.NEGATIVE_INFINITY;} else {k1 = div(sub(point.Y, this.POINTA.Y), sub(point.X, this.POINTA.X));}//当前线段的斜率k2Double k2 = null;if (this.POINTB.X.equals(this.POINTA.X)) {k2 = Double.NEGATIVE_INFINITY;} else {k2 = div(sub(this.POINTB.Y, this.POINTA.Y), sub(this.POINTB.X, this.POINTA.X));}if (k1 != null && k2 != null) {if (k1.equals(k2)) {//若斜率相同,继续判断给定点point的x是否在pointA.x和pointB.x之间,若在 则说明该点在当前边上if (sub(point.X, this.POINTA.X) * sub(point.X, this.POINTB.X) < 0) {result = true;}}}return result;}//叉积double mult(Point a, Point b, Point c) {return (a.X-c.X)*(b.Y-c.Y)-(b.X-c.X)*(a.Y-c.Y);}/*** 给定线段是否与当前线段相交* 相交返回true, 不相交返回false* @param line* @return*/public booleanisIntersect(Line line) {Point aa = this.POINTA;Point bb = this.POINTB;Point cc = line.POINTA;Point dd = line.POINTB;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) < Mat

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值