如何根据当前角度从其原点偏移圆弧扇区

时间:2012-08-22 21:43:35

标签: objective-c opengl-es trigonometry

我正在尝试研究如何创建一个新的矢量位置或目标矢量位置,以表示给定当前角度的圆(或一块饼)的提取部分。具体来说,我需要通过为我的动画增加每帧的x和y来计算从当前向量到达目标向量所需的总浮点值 - (这部分已经完成了一些背景信息)。我已经在我的程序中确定了以下几点信息......这是一个示例:

  • 矢量开始:x 1.000000 y 0.000000 z 0.200000
  • Vector End:0.406737 y 0.913545 z 0.200000
  • 交叉积。 x 0.182709,y 0.118653,z -0.913545
  • 以度为单位的起始角度:0.000000
  • 学位结束角度:66.000000
  • 矢量开始和结束之间的角度(度):33

我尝试使用下面的方法来增加/减少位置

float distanceX = (crossProduct.x > 0) ? crossProduct.x + 0.5 : crossProduct.x - 0.5;
float distanceY = (crossProduct.y > 0) ? crossProduct.y + 0.5 : crossProduct.y - 0.5; 

然后申请:

translationX = cosf(distanceX) * 1;
translationY = sinf(distanceY) * 1;
translationX /= 10;
translationY /= 10;

得到:translationX:0.077587 translationY:0.057994

最后将新坐标传递到:

glTranslatef(translationX, translationY, 0.0);

此代码在某种程度上有效,但在将其应用于圆的不同部分(即某些扇区位于共享象限中的象限)时遇到了麻烦。

感谢所有回复。这是实现的代码,如下所示  @Mark Oblak

GLKVector4 normalizedVectorStart = GLKVector4Normalize(vStart);
GLKVector4 normalizedVectorEnd = GLKVector4Normalize(vEnd);

GLKVector4 vectorOffset = GLKVector4Add(normalizedVectorStart, normalizedVectorEnd);
GLKVector4 normalizedVectorOffset = GLKVector4Normalize(vectorOffset);

NSLog(@"normalizedVectorOffset x %f y %f z%f", normalizedVectorOffset.x, normalizedVectorOffset.y, normalizedVectorOffset.z);

normalizedVectorOffset x 0.532707 y 0.345944 z0.151473

float sign = GLKVector4DotProduct(normalizedVectorOffset, vStart);
float distanceFromCenter = 0.2;

sign = (sign > 0.0) ? 1.0 : -1.0;

GLKVector4 normalizedVectorOffsetWithSign = GLKVector4MultiplyScalar(normalizedVectorOffset, sign * distanceFromCenter);
NSLog(@"normalizedVectorOffset (sign) x %f y %f z%f", normalizedVectorOffsetWithSign.x, normalizedVectorOffsetWithSign.y, normalizedVectorOffsetWithSign.z);

normalizedVectorOffset(sign)x 0.106541 y 0.069189 z0.030295

2 个答案:

答案 0 :(得分:1)

您可以通过将偏移的长度乘以角度的余弦和正弦来找到某个角度某个点的偏移量。

示例:

#define PI 3.141592654f

float angle = 45.0f;
float angleInRadians = angle * (PI / 180.0f);

float centerX = 0;
float centerY = 0;

float distanceFromCenter = 10.0f;

float offsetX = cos(angleInRadians) * distanceFromCenter;
float offsetY = sin(angleInRadians) * distanceFromCenter;

然后您可以在每个帧中插入distanceFromCenter

答案 1 :(得分:0)

我必须阅读这几次,但如果我理解正确的话:如果你的整个圆圈的中心位于(0,0,0)并且你有来自中心的2个向量的信息代表在哪里切片你的圈子,然后你的例子更简单..你的矢量是:     offsetVector = normalized((normalized(start)+ normalized(end)))

然后你需要得到偏移因子的符号:     sign =(dotProduct(offsetVector,start)> .0)? 1.0:-1.0

你的最终结果是:     offsetVector = offsetVector * sign * someFactor 其中someFactor表示你想要移动切片的中心多少。