检测一个点, 是否在一个半圆之内的方法

demo: http://jsbin.com/lihiwigaso

 

需求: 一个圆分成分部分, 鼠标滑上不同的区域显示不同的颜色

思路: 先判断这个点是否在圆之内, 再判断是否在所在的三角形之内就可以了

所需要的全部源码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>point-in-semicircle</title>
  <script src="jquery-1.7.2.min.js"></script>
<style>
body{
  border:0;
  margin:0;
  padding:0;
}
#bottom {
  position: absolute;
  left:0px;
  top:0px;
  width: 200px;
  height: 200px;
  border: 1px solid red;
}

#circleProcess {
  position: relative;
  top: 0;
  left: 0;
  width: 200px;
  height: 200px;
  stroke-dasharray: 360%;
  stroke-dashoffset: 0%;
  stroke: #6FEC6F;
  fill: none;
  -webkit-transform: rotate(-90deg);
  -moz-transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  -o-transform: rotate(-90deg);
  transform: rotate(-90deg);
}

#left {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 100px;
  width: 200px;
  border-radius: 100px 100px 0 0;
  -moz-border-radius: 100px 100px 0 0;
  -webkit-border-radius: 100px 100px 0 0;
  background:red;
  transform: rotate(-45deg);
  -moz-transform: rotate(-45deg);
  -webkit-transform: rotate(-45deg);
  transform-origin: 100px 100px;
  -moz-transform-origin: 100px 100px;
  -webkit-transform-origin: 100px 100px;
  display:none;

}

#right {
  position: absolute;
  top: 100px;
  left: 0px;
  height: 100px;
  width: 200px;
  border-radius: 0 0 100px 100px;
  -moz-border-radius: 0 0 100px 100px;
  -webkit-border-radius: 0 0 100px 100px;
  background:blue;
  transform: rotate(-45deg);
  -moz-transform: rotate(-45deg);
  -webkit-transform: rotate(-45deg);
  transform-origin: 100px 0px;
  -moz-transform-origin: 100px 0px;
  -webkit-transform-origin: 100px 0px;
  display:none;
}

#top {
  position: absolute;
  left: 0px;
  top: 0px;
  width: 200px;
  height: 200px;
  z-index: 100px;
}

</style>
</head>
<body>
<div id="bottom">
<svg id="circleProcess" xmlns="http://www.w3.org/2000/svg">
<circle id="circle" cx="100" cy="100" r="100" stroke-width="5" stroke-dashoffset="0%"></circle>
</svg>
<div id="left"></div>
<div id="right"></div>
</div>
<div id="top"></div>
</body>
</html>
<script>
jQuery(function($){
  var polygons = [
    [[0, 0], [200, 0], [100, 100], [0, 200]],
    [[100, 100], [200, 0], [200, 200], [0, 200]]
  ];

  var $left = $(‘#left‘);
  var $right = $(‘#right‘);
  var $top = $(‘#top‘);
  var oldIndex = -1;

  $top.on(‘mousemove‘, function(e){
    if( pointInsideCircle([e.offsetX, e.offsetY],[100, 100], 100) ){

      var index = inside([e.offsetX, e.offsetY], polygons);
      if(index===oldIndex){
        return;
      }
      if (index === 0) {
        $left.show();
        $right.hide();
      }
      if (index === 1) {
        $left.hide();
        $right.show();
      }
      oldIndex = index;

    } else {
      $left.hide();
      $right.hide();
      oldIndex = -1;
    }
  });

  $top.on(‘mouseleave‘, function(){
    $left.hide();
    $right.hide();
    oldIndex = -1;
  });

  function inside(point, polygons){
    for(var i=1; i>=0; i--){
      if(pointInsidePolygon(point, polygons[i])){
        return i;
      }
    }
    return -1;
  }

  function pointInsidePolygon(point, vs) {
    // ray-casting algorithm based on
    // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

    var x = point[0], y = point[1];

    var inside = false;
    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
        var xi = vs[i][0], yi = vs[i][1];
        var xj = vs[j][0], yj = vs[j][1];

        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) inside = !inside;
    }

    return inside;
  }

  function pointInsideCircle(point, circle, r) {
      if (r===0) return false
      var dx = circle[0] - point[0]
      var dy = circle[1] - point[1]
      return dx * dx + dy * dy <= r * r
  }

});
</script>

  

时间: 2024-10-11 08:11:51

检测一个点, 是否在一个半圆之内的方法的相关文章

js 判断一个点是否在一个多边形之内

出处: https://github.com/substack/point-in-polygon/blob/master/index.js github: https://github.com/substack/point-in-polygon module.exports = function (point, vs) { // ray-casting algorithm based on // http://www.ecse.rpi.edu/Homepages/wrf/Research/Sho

判断一个点是否在一个多边形里

“判断一个点是否在一个多边形里”,一开始以为是个挺难的问题,但Google了一下之后发现其实蛮简单,所用到的算法叫做“Ray-casting Algorithm”,中文应该叫“光线投射算法”,这是维基百科的描述:[维基百科] 简单地说可以这么判断:从这个点引出一根“射线”,与多边形的任意若干条边相交,累计相交的边的数目,如果是奇数,那么点就在多边形内,否则点就在多边形外. 如图,A点引一条射线,与多边形3条边相交,奇数,所以A点在多边形内,而从B点引一条射线,与多边形的2条边相交,偶数,所以B点

如何高效的检测一个数组是否包含某一个值

如何检测一个数组(未排序)是否包含一个指定的值?这在Java中是一个非常有用且常见的操作.这还是一个在stackoverflow投票最多的一个问题.在投票最多的答案中,有几种不同的方式来完成这个问题.但是时间复杂度存在很大的差异.下面,我将展示每个方法所花费的时间. 1.检测数组中是否包含某一个值的四种方式 1)使用List public static boolean useList(String[] arr, String targetValue) { return Arrays.asList

如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1  y1  1 | | x2 y2  1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3  1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正.这个公式可以在固定的时

C#如何检测一个字符串是不是合法的URL

C#如何检测一个字符串是不是合法的URL using System.Text.RegularExpressions; /// <summary> /// 检测串值是否为合法的网址格式 /// </summary> /// <param name="strValue">要检测的String值</param> /// <returns>成功返回true 失败返回false</returns> public static

检测一个字符串是否为回文? 两种方法

/** *    检测一个字符串是否为回文?三种方法? *    方法1:用str.charAt(index) !=  str.charAt(len-i-1) *    方法2:用StringBuilder . reverse反转 *    方法3:用开关控制 */ public class reversChar { public static void main(String[] args) { String str = "123321"; //中文也可以 System.out.pr

python中如何不区分大小写的判断一个元素是否在一个列表中

python中判断某一个元素是否在一个列表中,可以使用关键字in 和 not in. 示例如下: 如果需要输出相应的信息,可以搭配使用if语句,这里不赘述. ------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------

zoj 1041 Transmitters 判断一个可以移动的半圆最多可容纳的点的个数

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=41 题意:  判断一个可以移动的半圆最多可容纳的点的个数 . 分析:  计算在圆内的点, 然后  枚举 这些点, 将点 和 圆心 的连线 的直径 的左右点 统计, 最大 值 即可. 代码如下: const double EPS = 1e-12; const int Max_N = 160; double add(double a, double b){ return

检测一个DOM对象是否为空

我们时常要检测一个DOM对象是否为空. var $jObject = $('#btn'); alert($jObject ); 我们会发现,$jObject 永远不会为空.为什么呢?$ 方法查找对象,始终都会返回一个jQuery 对象的. 解决办法: 我们就要把jQuery对象转换成js对象. ①var dom = $jObect[0]; alert(dom); ②if($jObect.length>0) {alert("not null!");}