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

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>

  

转载于:https://www.cnblogs.com/zlog/p/6109223.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值