java 线绕点旋转_给定两个顶点围绕中心点旋转线

本文介绍如何在Java中计算2D线段的中心点,并使用数学公式将其围绕任意点旋转。提供了围绕多分段线的逻辑中心旋转的详细步骤,包括将线段转换为极坐标,进行旋转,然后转换回直角坐标。还提供了一个Python示例函数,用于根据给定角度旋转多边形线。
摘要由CSDN通过智能技术生成

点(x1,y1)和(x2,y2)之间的线段的中心点(cx,cy)的坐标是:

cx = (x1 + x2) / 2

cy = (y1 + y2) / 2

换句话说,它只是两对x和y坐标值的平均值或算术平均值 .

对于多分段线或折线,其逻辑中心点的x和y坐标只是所有点的x和y值的对应平均值 . 平均值只是值的总和除以它们的数量 .

原点(0,0)周围的通用公式为rotate a 2D point(x,y)θ弧度:

x′ = x * cos(θ) - y * sin(θ)

y′ = x * sin(θ) + y * cos(θ)

要围绕不同的中心(cx,cy)执行旋转,需要通过首先从点的坐标减去所需旋转中心的坐标来调整点的x和y值,这具有移动的效果(已知)在几何中作为translating it)在数学上表达如下:

tx = x - cx

ty = y - cy

然后将该中间点旋转所需的角度,最后将旋转点的x和y值加回到每个坐标的x和y . 从几何学角度来说,它是以下操作顺序: Translate → Rotate → Untranslate

这个概念可以扩展到允许围绕任意点旋转整条折线 - 例如它自己的逻辑中心 - 只需将描述的数学应用到其中每个线段的每个点 .

为了简化该计算的实现,所有三组计算的数值结果可以组合并用一对数学公式表示,这些公式同时执行它们 . 因此,通过使用以下方法旋转点(cx,cy)周围的现有点(x,y),θ弧度,可以获得新点(x',y'):

x′ = ( (x - cx) * cos(θ) + (y - cy) * sin(θ) ) + cx

y′ = ( -(x - cx) * sin(θ) + (y - cy) * cos(θ) ) + cy

将此数学/几何概念合并到您的函数中会产生以下结果:

from math import sin, cos, radians

def rotate_lines(self, deg=-90):

""" Rotate self.polylines the given angle about their centers. """

theta = radians(deg) # Convert angle from degrees to radians

cosang, sinang = cos(theta), sin(theta)

for pl in self.polylines:

# Find logical center (avg x and avg y) of entire polyline

n = len(pl.lines)*2 # Total number of points in polyline

cx = sum(sum(line.get_xdata()) for line in pl.lines) / n

cy = sum(sum(line.get_ydata()) for line in pl.lines) / n

for line in pl.lines:

# Retrieve vertices of the line

x1, x2 = line.get_xdata()

y1, y2 = line.get_ydata()

# Rotate each around whole polyline's center point

tx1, ty1 = x1-cx, y1-cy

p1x = ( tx1*cosang + ty1*sinang) + cx

p1y = (-tx1*sinang + ty1*cosang) + cy

tx2, ty2 = x2-cx, y2-cy

p2x = ( tx2*cosang + ty2*sinang) + cx

p2y = (-tx2*sinang + ty2*cosang) + cy

# Replace vertices with updated values

pl.set_line(line, [p1x, p2x], [p1y, p2y])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值