根据旋转角度计算新的点偏移量?

时间:2014-09-24 01:38:18

标签: c# .net math trigonometry robotics

我正在处理过去几周的申请,涉及一些三角学,目前我被困住了。如下图所示,我有一个圆形项目(位置#1的绿色圆圈)我知道中心点(让我们称之为X1,Y1)。圆圈有另一个点(橙色圆圈)偏离中心位置 - 在另外两个标记(蓝色圆圈)之间。这些标记可以四处移动。计算橙色点的坐标(让我们称之为X2,Y2),并计算相对于圆的水平线的蓝线角度(称之为角度)。

Diagram

我可以通过以下方式计算圆心和点之间的差异:

deltaX = X2-X1

deltaY = Y2-Y1

我需要移动并旋转绿色圆圈(CW或CCW - 以较短者为准)从它的起始位置(位置1)到位置2.这意味着角度可以是负的或正的。蓝线必须以垂直方向结束,橙色点位于位置2的中心(红色方块)。我知道位置2中心的坐标(让我们称之为X3,Y3)。位置#1和位置#2正好相互成90度。

我以为我可以使用一些计算点的旋转的trig标识公式,如下:

offsetX = deltaX * cos(90-Angle) - deltaY * sin(90-Angle)

offsetY = deltaX * sin(90-Angle)+ deltaY * cos(90-Angle)

我希望这些偏移是我需要在它移动/旋转到位置2时将圆圈调整到它的新中心。

X3 = X3 + offsetX

Y3 = Y3 + offsetY

然而,当我尝试使用这个数学时,它并没有将圆圈的橙色标记放在方形的中心。不确定我的方程和计算是否正确,基于旋转角度(正或负,CW或CCW)或我是否正确使用角度(我从90度减去已知角度)。如何正确计算最终点/位置?任何帮助和示例将不胜感激!

非常感谢你的时间!

2 个答案:

答案 0 :(得分:0)

因此您需要按90 - Angle旋转圆圈,然后将橙色点移动到(X3,Y3)? 首先,您需要在旋转后找到橙色点坐标:

newX = X2 * cos(90 - Angle) - Y2 * sin(90 - Angle);
newY = X2 * sin(90 - Angle) + Y2 * cos(90 - Angle);
旋转后,

newXnewY是橙色点坐标。要找到移动转换,只需减去:

moveX = X3 - newX;
moveY = Y3 - newY;

现在,如果您按90 - Angle旋转圆圈并将其移动(moveX,moveY),橙色点将移至(X3,Y3)。也就是说,如果你绕(0,0)点旋转圆圈。如果围绕某个(X,Y)点旋转,首先需要从X2中减去X,从Y2中减去Y,然后将X添加到newX,Y添加到newY。那次减法'移动'您的旋转基点指向(0,0),因此旋转后需要将其移回:

newX = (X2 - X) * cos(90 - Angle) - (Y2 - Y) * sin(90 - Angle) + X;
newY = (X2 - X) * sin(90 - Angle) + (Y2 - Y) * cos(90 - Angle) + Y;

答案 1 :(得分:0)

请注意,您的代码使用的是逆时针旋转(通常是逆时针测量角度),这可能就是您无法获得预期结果的原因。如果你想要顺时针旋转,请尝试:

   public DataPoint[] getTimeAndU() {

        final DataPoint[] dataPoint = new DataPoint[2000];

        final DataTransmit dataTransmit = new DataTransmit(mContext) {
            @Override
            protected void onCompleted(String json) {
                Log.v("joson",json);
                if (json != null) {
                    //   Toast.makeText(this,"sucess"+json+"",Toast.LENGTH_LONG).show();
                    try {
                        Log.v("testt","dtsfasdf");
                       // JSONArray ja = new JSONArray(json);
                        JSONObject jo = new JSONObject(json);
                        for(int i = 0; i < jo.length(); i++){
                            if (i > 1) {
                                JSONObject obj2 = jo.getJSONObject("a"+i);

                                double x = toDouble(obj2.getString("time_s"));
                                double y = toDouble( obj2.getString("u_mv"));

                                dataPoint[i] = new DataPoint(x,y);
                            }else{
                                dataPoint[i] = new DataPoint(0,0);
                            }

                        }

                    } catch (Throwable t) {
                        Log.e("app", "Could not parse malformed JSON: \"" + String.valueOf(t) + "\"");
                        Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
                    }

                }
            }
        };
        //dataTransmit.requestJasonArray("http://192.168.1.12//Rehan/UrbanClout.php?FunctionKey=loginUser&login_name=aaa&login_pass=aaa", "Schedule");


     //   dataTransmit.requestJasonArray("http://192.168.1.8/ahsan_bhai_project/excel_reader/excel_reader/example.php", "Schedule");

        dataTransmit.requestJasonObject("http://192.168.10.32/ahsan_bhai_project/excel_reader/excel_reader/example.php?FunctionKey=time_u","Schedule");


        return dataPoint;
    }

确保您的角度以弧度而非度数。 绘制一些行也可以帮助您调试。