计算点绕某坐标顺时针旋转后点的坐标(极坐标方式推导,含java写法)
关键词:顺时针 旋转 点 坐标 极坐标 直角坐标
快速结论
感谢岭南笑的文章《Java 平面一点绕另一点旋转后的坐标》
点A(x1,y1)绕某坐标B(x2,y2)顺时针旋转(θ度)后坐标C(x,y):
x = (x1 - x2) * cos(θ) + (y1 - y2) * sin(θ) + x2
y = (y1 - y2) * cos(θ) - (x1 - x2) * sin(θ) + y2
Java写法:
// A点坐标,B点坐标
int x1 = x1坐标, y1 = y1坐标, x2 = x2坐标, y2 = y2坐标;
// 旋转角度θ
int degrees = θ;
// 弧度
double theta = Math.toRadians(degrees);
BigDecimal sinBigDecimal = BigDecimal.valueOf(Math.sin(theta));
BigDecimal cosBigDecimal = BigDecimal.valueOf(Math.cos(theta));
BigDecimal x12BigDecimal = BigDecimal.valueOf(x1 - x2);
BigDecimal y12BigDecimal = BigDecimal.valueOf(y1 - y2);
BigDecimal x2BigDecimal = BigDecimal.valueOf(x2);
BigDecimal y2BigDecimal = BigDecimal.valueOf(y2);
// 最终x坐标
BigDecimal xBigDecimal = x12BigDecimal.multiply(cosBigDecimal).add(y12BigDecimal.multiply(sinBigDecimal).add(x2BigDecimal);
BigDecimal yBigDecimal = y12BigDecimal.multiply(cosBigDecimal).subtract(x12BigDecimal.multiply(sinBigDecimal).add(y2BigDecimal);
// 此步骤可按需忽略
// 设置输出精度,以下为采用四舍五入法保留小数点0位
System.out.println("旋转后x坐标:" + xBigDecimal.setScale(0, BigDecimal.ROUND_HALF_UP));
System.out.println("旋转后y坐标:" + y12BigDecimal.setScale(0, BigDecimal.ROUND_HALF_UP));
其他非极坐标推导参考文章
极坐标推导
概念说明引用取自百度百科
正如所有的二维坐标系,极坐标系也有两个坐标轴:r(半径坐标)和θ(角坐标、极角或方位角,有时也表示为φ或t)。r坐标表示与极点的距离,θ坐标表示按逆时针方向坐标距离0°射线(有时也称作极轴)的角度,极轴就是在平面直角坐标系中的x轴正方向。比如,极坐标中的(3,60°)表示了一个距离极点3个单位长度、和极轴夹角为60°的点。(−3,240°) 和(3,60°)表示了同一点,因为该点的半径为在夹角射线反向延长线上距离极点3个单位长度的地方(240° − 180° = 60°)。
极坐标系中一个重要的特性是,平面直角坐标中的任意一点,可以在极坐标系中有无限种表达形式。通常来说,点(r,θ)可以任意表示为(r,θ ± 2kπ)或(−r,θ ± (2k+ 1)π),这里k是任意整数。[7] 如果某一点的r坐标为0,那么无论θ取何值,该点的位置都落在了极点上。
注意:极坐标θ是逆时针角度
极坐标系中的两个坐标r和θ可以由下面的公式转换为直角坐标系下的坐标值:
x = r * cos(θ)
y = r * sin(θ)
根据点A(x1,y1)绕某坐标B(x2,y2)顺时针旋转(θ度)后坐标C(x,y)
,假设点B(x2,y2)
为上图原点,那么点A(x1,y1)
角度为θ1
,点B(x2,y2)
角度为θ1+θ2
那么,以点A(x1,y1)
为圆心的直角坐标系方程则为:
x1 - x2 = r * cos(θ1)
y1 - y2 = r * sin(θ1)
以点C(x,y)
为圆心的直角坐标系方程则为:
x - x2 = r * cos(θ1 + θ2)
y - y2 = r * sin(θ1 + θ2)
根据二角和差公式可得:
x - x2 = r * cos(θ1 + θ2)
= r * cos(θ1) * cos(θ2) - r * sin(θ1) * sin(θ2)
y - y2 = r * sin(θ1 + θ2)
= r * sin(θ1) * cos(θ2) + r * cos(θ1) * sin(θ2)
代入点A(x1,y1)
为圆心的直角坐标系方程可得:
x - x2 = r * cos(θ1) * cos(θ2) - r * sin(θ1) * sin(θ2)
= (x1 - x2) * cos(θ2) - (y1 - y2) * sin(θ2)
y - y2 = r * sin(θ1) * cos(θ2) + r * cos(θ1) * sin(θ2)
= (y1 - y2) * cos(θ2) + (x1 - x2) * sin(θ2)
点A
极坐标角度为θ1
,点B
极坐标角度为θ1+θ2
,则顺时针角度θ
为θ1
加极坐标顺时针到θ2
线的角度,即:
θ + θ2 = 360
代入公式可得:
x - x2 = (x1 - x2) * cos(θ2) - (y1 - y2) * sin(θ2)
= (x1 - x2) * cos(360 - θ) - (y1 - y2) * sin(360 - θ)
= (x1 - x2) * (cos(360) * cos(θ) + sin(360) * sin(θ)) - (y1 - y2) * (sin(360) * cos(θ) - cos(360) * sin(θ))
= (x1 - x2) * cos(θ) - (y1 - y2) * (-sin(θ))
= (x1 - x2) * cos(θ) + (y1 - y2) * sin(θ)
y - y2 = (y1 - y2) * cos(θ2) + (x1 - x2) * sin(θ2)
= (y1 - y2) * cos(360 - θ) + (x1 - x2) * sin(360 - θ)
= (y1 - y2) * (cos(360) * cos(θ) + sin(360) * sin(θ)) + (x1 - x2) * (sin(360) * cos(θ) - cos(360) * sin(θ))
= (y1 - y2) * cos(θ) + (x1 - x2) * (-sin(θ))
= (y1 - y2) * cos(θ) - (x1 - x2) * sin(θ)
此时可得点C(x,y)
坐标公式:
x = (x1 - x2) * cos(θ) + (y1 - y2) * sin(θ) +x2
y = (y1 - y2) * cos(θ) - (x1 - x2) * sin(θ) +y2
参考文献:
《坐标轴的旋转及绕某一点旋转后坐标值求解》 感谢方帅。启发于此文,但由于该文最终推导有误,建议以本文推导为准。