Objective c 如何基于当前角度从原点偏移圆的扇区

Objective c 如何基于当前角度从原点偏移圆的扇区,objective-c,opengl-es,trigonometry,Objective C,Opengl Es,Trigonometry,我正在尝试解决如何创建一个新的矢量位置或目标矢量位置,以表示给定当前角度的圆(或饼图)的提取部分。具体地说,我需要计算出从当前向量到达目标向量所需的总浮点值,方法是为我的动画每帧增加x和y(这部分已经完成,只是一些背景信息)。我已经在我的程序中确定了以下信息位…以下是一个示例: 矢量起点:x1.000000y0.000000z0.200000 矢量端:0.406737 y 0.913545 z 0.200000 交叉积。x0.182709,y0.118653,z-0.913545 以度为单位的

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

  • 矢量起点:x1.000000y0.000000z0.200000
  • 矢量端:0.406737 y 0.913545 z 0.200000
  • 交叉积。x0.182709,y0.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);
这段代码在某种程度上起作用,但当我将其应用于圆的不同部分时遇到了麻烦,即某些扇区位于共享象限中的象限

谢谢你的回复。下面是所建议的实现代码

标准化矢量偏移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);

规格化矢量偏移量(符号)x 0.106541 y 0.069189 z0.030295

通过将偏移量的长度乘以角度的余弦和正弦,可以找到特定角度处某点的偏移量

例如:

#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;

然后你可以在每一帧中插入
distance from center

我已经读了好几遍了,但是如果我理解正确:如果你的整个圆的中心在(0,0,0),并且你有两个向量的信息从中心开始,表示在哪里切割你的圆,那么你的例子就简单多了。。你的向量是: 偏移向量=标准化((标准化(开始)+标准化(结束)))

然后需要得到偏移因子的符号: 符号=(点积(偏移向量,开始)>.0)?1.0:-1.0

你的最终结果是: 偏移向量=偏移向量*符号*某些因子
其中someFactor表示您希望从中心移动切片的距离。

我不确定是否理解您的问题?您是否正在尝试将饼图的一个部分设置为远离图表中心的动画?另外,为什么要使用OpenGL而不是核心动画+核心图形?您不能将交叉积标准化以获得
[cx,cy,cz]
?然后你的翻译变成
[x0,y0,z0]+t*[cx,cy,xz]
,其中t是你的动画时间。(也许我错过了什么?)无论如何,当使用
cos-1
sin-1
时,你必须检查你的起点在哪个象限,并有条件地翻转结果的符号
x/y
,谢谢这真的很有帮助,下面是实现的代码:
#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;