我正在处理过去几周的申请,涉及一些三角学,目前我被困住了。如下图所示,我有一个圆形项目(位置#1的绿色圆圈)我知道中心点(让我们称之为X1,Y1)。圆圈有另一个点(橙色圆圈)偏离中心位置 - 在另外两个标记(蓝色圆圈)之间。这些标记可以四处移动。计算橙色点的坐标(让我们称之为X2,Y2),并计算相对于圆的水平线的蓝线角度(称之为角度)。
我可以通过以下方式计算圆心和点之间的差异:
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度减去已知角度)。如何正确计算最终点/位置?任何帮助和示例将不胜感激!
非常感谢你的时间!
答案 0 :(得分:0)
因此您需要按90 - Angle
旋转圆圈,然后将橙色点移动到(X3,Y3)?
首先,您需要在旋转后找到橙色点坐标:
newX = X2 * cos(90 - Angle) - Y2 * sin(90 - Angle);
newY = X2 * sin(90 - Angle) + Y2 * cos(90 - Angle);
旋转后, newX
和newY
是橙色点坐标。要找到移动转换,只需减去:
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;
}
确保您的角度以弧度而非度数。 绘制一些行也可以帮助您调试。