计算点绕某坐标顺时针旋转后点的坐标(极坐标方式推导,含java写法)

计算点绕某坐标顺时针旋转后点的坐标(极坐标方式推导,含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,那么无论θ取何值,该点的位置都落在了极点上。

注意:极坐标θ是逆时针角度

点(3,60°) 和 点(4,210°)图
极坐标系中的两个坐标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

参考文献:
《坐标轴的旋转及绕某一点旋转后坐标值求解》 感谢方帅。启发于此文,但由于该文最终推导有误,建议以本文推导为准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值