我正在编写一个脚本,其中图标围绕给定的轴(或原点)旋转。我已经能够在椭圆周围旋转图标,但我也想让它们围绕一定宽度,高度和原点的矩形移动。

我这样做是因为我当前的代码将所有coords存储在一个数组中,每个角度整数作为键,重用这段代码将更容易使用。

如果有人能给我一个100x150矩形的例子,那就太棒了。

编辑:澄清一下,通过旋转我的意思是围绕一个形状的周边(或轨道)移动。

有帮助吗?

解决方案

您知道矩形的大小,并且您需要将整个角度间隔分成四个不同的区域,因此您知道来自矩形中心的光线是否与矩形的右侧,顶部,左侧或底部相交。

如果角度为:-atan(d / w)<!> lt; alfa <!> lt; atan(d / w)光线与矩形的右侧相交。那么既然你知道从矩形中心到右边的x位移是d / 2,那么位移dy除以d / 2就是tan(alfa),所以

dy = d / 2 * tan(alfa)

你可以用其他三个角度间隔来同样处理它。

好的,这里有。你有一个宽度为w且深度为d的矩形。在中间你有中心点,cp。我假设你想为角度α的不同值计算P.

我将矩形划分为四个不同的区域或角度间隔(1到4)。我上面提到的间隔是右边第一个。我希望这对你有意义。

首先需要计算角度间隔,这些是由w和d完全确定的。根据alfa的值,相应地计算P,即<!> quot; ray <! > QUOT;从CP到P与矩形的上,下,右或左相交。

干杯

其他提示

这是为Pebble智能手表制作并验证的,但修改为伪代码:

struct GPoint {
  int x;
  int y;
}

// Return point on rectangle edge.  Rectangle is centered on (0,0) and has a width of w and height of h
GPoint getPointOnRect(int angle, int w, int h) {
  var sine = sin(angle), cosine = cos(angle);   // Calculate once and store, to make quicker and cleaner
  var dy = sin>0 ? h/2 : h/-2;                  // Distance to top or bottom edge (from center)
  var dx = cos>0 ? w/2 : w/-2;                  // Distance to left or right edge (from center)
  if(abs(dx*sine) < abs(dy*cosine)) {           // if (distance to vertical line) < (distance to horizontal line)
    dy = (dx * sine) / cosine;                  // calculate distance to vertical line
  } else {                                      // else: (distance to top or bottom edge) < (distance to left or right edge)
    dx = (dy * cosine) / sine;                  // move to top or bottom line
  }
  return GPoint(dx, dy);                        // Return point on rectangle edge
}


Use:
rectangle_width  = 100;
rectangle_height = 150;
rectangle_center_x = 300;
rectangle_center_y = 300;
draw_rect(rectangle_center_x - (rectangle_width/2), rectangle_center_y - (rectangle_center_h/2), rectangle_width, rectangle_height);
GPoint point = getPointOnRect(angle, rectangle_width, rectangle_height);
point.x += rectangle_center_x;
point.y += rectangle_center_y;
draw_line(rectangle_center_x, rectangle_center_y, point.x, point.y);

使用角度作为参数执行此操作的一种简单方法是使用矩形的边界简单地剪切X和Y值。换句话说,计算位置就像图标将围绕圆形或椭圆形路径旋转一样,然后应用:

(假设轴对齐的矩形以(0,0)为中心,X轴长度为XAxis,Y轴长度为YAxis):

if (X > XAxis/2)    
         X = XAxis/2;

if (X < 0 - XAxis/2)
         X = 0 - XAxis/2;

if (Y > YAxis/2)    
         Y = YAxis/2;

if (Y < 0 - YAxis/2)    
         Y = 0 - YAxis/2;

这种方法的问题在于角度不会完全准确,并且沿矩形周长的速度不会是恒定的。对在其角落处填充矩形的椭圆进行建模可以最大限度地减少效果,但如果您正在寻找平滑,恒定速度的<!>“轨道,<!>”;这种方法是不够的。

如果你认为你的意思是旋转,就像地球围绕太阳旋转一样(不是自转......所以你的问题是关于如何沿着矩形的边缘滑动?)

如果是这样,你可以尝试一下:

# pseudo coode
for i = 0 to 499
  if i < 100:  x++
  else if i < 250: y--
  else if i < 350: x--
  else y++

  drawTheIcon(x, y)

更新:(请参阅下面的评论)

使用一个角度,一行将是

y / x = tan(th)       # th is the angle

其他线条很简单,因为它们只是水平或垂直。所以例如,它是x = 50,你可以把它放到上面的行中得到y。为水平线和垂直线的交点做到这一点(例如,角度为60度,它射出<!> << NorthEast <!>; ...现在你有两个点。然后是最接近的点原点是首先击中矩形的那个。)

使用 2D转换矩阵。许多语言(例如Java)本身都支持这种语言(查找AffineTransformation);否则,写出一个自己动作的例程,一次,调试好,永远使用它。我必须用不同的语言写下五篇。

只需简单地完成旋转,就可以通过 line-line找到矩形上的位置相交。通过交叉两行找到轨道图标的中心:

  1. 以您想要的角度从您的旋转中心射出的光线
  2. 四个方面中的一个,以你想要的角度(四个象限)为界。

在一张纸上绘制一幅带有矩形和旋转中心的草图。首先将矩形转换为坐标系原点的中心(记住转换参数,您需要稍后反转转换)。旋转矩形使其边与坐标轴平行(原因相同)。

现在你有一个在原点有一个已知角度的三角形,另一边是已知长度(矩形一边长度的一半),你现在可以:

- 解决三角形

- 撤消轮换

- 撤消翻译

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top