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

您所在的位置:网站首页 平面曲线绕坐标轴旋转后的方程 计算点绕某坐标顺时针旋转后点的坐标(极坐标方式推导,含java写法)

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

2024-03-26 19:29| 来源: 网络整理| 查看: 265

计算点绕某坐标顺时针旋转后点的坐标(极坐标方式推导,含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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3