Finding points on a rectangle at a given angle

后端 未结 7 2019
没有蜡笔的小新
没有蜡笔的小新 2020-12-14 02:43

I\'m trying to draw a gradient in a rectangle object, with a given angle (Theta), where the ends of the gradient are touching the perimeter of the rectangle.

7条回答
  •  误落风尘
    2020-12-14 03:06

    Javascript version:

    function edgeOfView(rect, deg) {
      var twoPI = Math.PI*2;
      var theta = deg * Math.PI / 180;
      
      while (theta < -Math.PI) {
        theta += twoPI;
      }
      
      while (theta > Math.PI) {
        theta -= twoPI;
      }
      
      var rectAtan = Math.atan2(rect.height, rect.width);
      var tanTheta = Math.tan(theta);
      var region;
      
      if ((theta > -rectAtan) && (theta <= rectAtan)) {
          region = 1;
      } else if ((theta > rectAtan) && (theta <= (Math.PI - rectAtan))) {
          region = 2;
      } else if ((theta > (Math.PI - rectAtan)) || (theta <= -(Math.PI - rectAtan))) {
          region = 3;
      } else {
          region = 4;
      }
      
      var edgePoint = {x: rect.width/2, y: rect.height/2};
      var xFactor = 1;
      var yFactor = 1;
      
      switch (region) {
        case 1: yFactor = -1; break;
        case 2: yFactor = -1; break;
        case 3: xFactor = -1; break;
        case 4: xFactor = -1; break;
      }
      
      if ((region === 1) || (region === 3)) {
        edgePoint.x += xFactor * (rect.width / 2.);                                     // "Z0"
        edgePoint.y += yFactor * (rect.width / 2.) * tanTheta;
      } else {
        edgePoint.x += xFactor * (rect.height / (2. * tanTheta));                        // "Z1"
        edgePoint.y += yFactor * (rect.height /  2.);
      }
      
      return edgePoint;
    };

提交回复
热议问题