Math 使对象仅以度数绕另一个对象旋转(而非仅以弧度整数数学)

Math 使对象仅以度数绕另一个对象旋转(而非仅以弧度整数数学),math,integer,Math,Integer,我目前正在开发一种需要物体围绕另一个物体运行的东西。虽然,我是有限的。我不能使用弧度来实现这一点。我有权接触正反两方面的知识和学位。但我不能使用弧度(它会破坏一切)。请注意,这是在Minecraft内,并且那里的值不能保持浮动或双精度。因此,像0.017这样的答案将是17。因此,我不能使用弧度 计算正弦和余弦的函数限制在-180到180之间。这意味着我不能简单地将0.787弧度转换为787弧度,因为这超出了限制,返回的答案将完全错误 现在代码应该是这样的: var距离=100;//从轨道中心开

我目前正在开发一种需要物体围绕另一个物体运行的东西。虽然,我是有限的。我不能使用弧度来实现这一点。我有权接触正反两方面的知识和学位。但我不能使用弧度(它会破坏一切)。请注意,这是在Minecraft内,并且那里的值不能保持浮动或双精度。因此,像
0.017
这样的答案将是
17
。因此,我不能使用弧度

计算正弦和余弦的函数限制在-180到180之间。这意味着我不能简单地将
0.787
弧度转换为
787
弧度,因为这超出了限制,返回的答案将完全错误

现在代码应该是这样的:

var距离=100;//从轨道中心开始
变量度=45;//绕360度轨道运行
var弧度=度*(数学PI/180);
var x=数学cos(弧度)*距离;

var y=数学正弦(弧度)*距离为什么不在定点中创建自己的LUT?在C++中类似这样的内容:

const int fp=1000;//定点精度
const int mycos[360]={1000、999、999、998、997、996、994、992、990,}
浮点数x,y,x0=0,y0=0,r=50,ang=45;
x=x0+((r*mycos[ang%360])/fp);
y=y0+((r*mycos[(ang+90)%360])/fp);
您还可以编写一个脚本,为您创建LUTLUT中的每个值的计算如下:

LUT[i]=fp*cos(i*M_PI/180);//i=0,1,2,…359
现在要在使用前规格化角度:

ang%=360;
if(ang8);
cx+=si;
dx=41*cx;
如果(dx>16);否则dx>>=16;
si-=dx;
}
}
void mysin_init127()//
{
int bx,si=793,cx=0,dx;//si~振幅
对于(bx=0;bx>8)+1;
cx+=si;
dx=41*cx;
如果(dx>16);否则dx>>=16;
si-=dx;
}
}
intmysin(inta){returnmysinlut[(a)&255];}
intmycos(inta){returnmysinlut[(a+64)&255];}
设置常数时,应确保
sin[256]
(取决于调用哪个init)范围内保持窦的大致近似值,并且角度周期为
256
,而不是
360
。您需要首先调用
mysin_init???()
一次初始化LUT之后,您可以使用
mysin,mycos
只是不要忘记将最终结果除以
/100
>7

当我使用VCL渲染真实和近似圆的叠加时:

void draw()
{
//选择范围
//#定义范围100
#定义范围127
//只有一次
静态bool_init=true;
如果(_init)
{
_init=false;
#ifdef范围100
mysin_init100();
#恩迪夫
#ifdef范围127
mysin_init127();
#恩迪夫
}
int a,x,y,x0,y0,r;
//清屏
bmp->画布->画笔->颜色=白色;
bmp->Canvas->FillRect(TRect(0,0,xs,ys));
//根据窗口分辨率xs,ys计算圆大小
x0=xs>>1;
y0=ys>>1;
r=x0;如果(r>y0)r=y0;r=(r*7)/10;
//渲染实圆
bmp->Canvas->Pen->Color=clRed;
bmp->Canvas->椭圆(x0-r,y0-r,x0+r,y0+r);
//渲染近似圆
bmp->Canvas->Pen->Color=clBlack;
for(a=0;a>已签名(复制MSB)
x=x0+((r*mycos(a))>>7);
y=y0-((r*mysin(a))>>7);
//如果>>为无符号(插入0)且所有圆点均为非负
//x=((x07;
//y=((y07;
//无论发生什么情况,这都应该有效
//x=r*mycos(a);if(x>7);else x>>=7;x=x0+x;
//y=r*mysin(a);如果(y>7);否则y>=7;y=y0-y;
//这项工作无论做什么,都要用签名除法
//x=x0+((r*mycos(a))/127);
//y=y0-((r*mysin(a))/127);
#恩迪夫
如果(!a)bmp->Canvas->MoveTo(x,y);
else bmp->Canvas->LineTo(x,y);
}
Form1->Canvas->Draw(0,0,bmp);
//bmp->SaveToFile(“out.bmp”);
}
结果如下所示:


红色是实圆,黑色是使用
mysin,mycos
的圆。正如你所看到的,由于近似精度的原因,有一些小偏差,但这里没有使用浮点运算。这很奇怪,因为3种位移位方法的结果是不同的数字(这一定是对mine编译器的一些优化)第一种方法中的常量经过了调整。

也许在这里你会得到一些更好的数学答案:也许你会展示一些代码或提供更多的信息,现在有点模糊,我也会在那里发布一个,谢谢你的建议=)度数和弧度之间的转换非常简单:只需将度数值乘以
pi
,即可得到弧度值。如果不能使用小数,可以通过乘除来解决accordingly@GalAbra实际上我做不到。计算sin和cos的函数限制在-180和180d之间白鹭(因为无法访问小数)。如果我必须使用,例如,0.787弧度,我必须在函数中输入787,这将破坏它并返回一个完全错误的答案。请不要将JPG用于非摄影图像!非常棒的答案,伙计,谢谢!希望我能在函数中实现此功能=)@MSpace Dev这是我们在FPU和浮点运算之前使用的:)…那时我们甚至没有乘法指令…必须在我们的计算机上实现它own@MSpace-devi刚刚发现了一个bug(
mysin
mycos
我在那里修复了代码)另外,如果你对低级操作感兴趣,我仍然在调整常数,当完成后,这些更新会更好地更新:“@ MSPACE DEV,答案是C++……只有标题是C……它们几乎是相同的,但是在C中没有CLE和LIBS……@ MSPACE DEVI我更新了代码,这是奇怪的。