0

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

  • 矢量开始:x 1.000000 y 0.000000 z 0.200000
  • 矢量结束: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;

得到: 翻译X:0.077587 翻译Y: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 (符号) x 0.106541 y 0.069189 z0.030295

4

2 回答 2

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每一帧进行插值。

于 2012-08-23T04:44:12.907 回答
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 表示您要从中心移动切片的距离。

于 2012-08-23T07:07:01.000 回答