用坐标、长度、宽度和角度计算矩形的中心
Posted
技术标签:
【中文标题】用坐标、长度、宽度和角度计算矩形的中心【英文标题】:Calculating center of rectangle with coordinate, length, width and angle 【发布时间】:2020-06-19 13:57:06 【问题描述】:我想确定一个旋转矩形的中心。必须首先计算这个矩形(见图)。为此,已知坐标 p(x1, y1) 在所有四个方向上的距离(船头、左舷、星形、船尾)。正方形的方向也以度为单位。
对我来说最简单的解决方案是围绕蓝色轴计算一个矩形,然后确定这个矩形的中心。不幸的是,考虑到旋转,我已经在确定正方形的顶点时遇到了问题。
有谁知道如何使用这些输入计算顶点的坐标(Java 中首选)?如果有人知道另一种更简单的方法,我将不胜感激。非常感谢!
【问题讨论】:
这个问题主要与数学有关,而不是真正的编程问题。应该在 math.stackexchange.com 上询问 【参考方案1】:如果star
轴相对于OX轴有旋转phi
,那么它的方向向量是
sx, sy = cos(phi), sin(phi) //don't forget about radians and degrees
垂直(bow
方向)向量是
bx, by = -sy, sx
所以图片最上面的顶点有坐标
tx = px + star * sx + bow * bx
ty = py + star * sy + bow * by
底部顶点:
ux = px - port * sx - stern * bx
uy = py - port * sy - stern * by
矩形中心是这些顶点的中间
cx = px + sx * (star - port) / 2 + bx * (bow - stern) / 2
cy = py + sy * (star - port) / 2 + by * (bow - stern) / 2
并将b*
变量恢复为sx, sy
:
并考虑所需的角度方向:
cx = px + sx * (star - port) / 2 + sy * (bow - stern) / 2
cy = py - sy * (star - port) / 2 + sx * (bow - stern) / 2
【讨论】:
我用以下输入数据检查了一个简单示例的答案:pos_x = 0,pos_y = 0,bow = 10,stern = 20,port = 5,star = 5。我检查了它4 种不同的航向值:0°、90°、180°、270°。我希望这个输入获得以下四个位置:(0,-5)、(-5,0)、(0,5) 和 (5,0)。对于 0 和 180°,我得到了正确的解决方案。但是,对于 90° 和 270°,您的解决方案会交换结果。你知道如何解决这个问题吗? 也许你错过了那个 bx,因为值不同于 sx, sy。我只用 sx/sy 添加了最终表达式。对于 90:cx = 0 + 0 - 1 * (-5) = 5
是的,完全正确,对于 90°,我像你一样得到值 5,但值 -5 应该出来。目前,点 P 位于多边形的前面。因此,如果多边形向右看,则该点已向左移动。这将导致 90° 为 -5。反之亦然 270°(向右移动,结果 = 5)。您了解我对您的解决方案的问题吗?
看来您使用的是另一个角度方向。例如,您的图片显示的角度约为 45 度,并且 center.x 绝对位于 P 的右侧 - 正值。但这不是问题 - 我只是在最终公式中更改了符号。【参考方案2】:
替代公式(来源:https://www.researchgate.net/publication/238090180_A_Study_on_the_efficiency_enhancement_of_automatic_radar_tracking_and_analyses_of_marine_traffic_in_Tokyo_Bay):
c_cog = Math.toRadians(course);
double xc = pos_x + (bow - stern) * Math.sin(course) / 2 + (star-port) * Math.sin(course+90) / 2;
double yc = pos_y + (bow - stern) * Math.cos(course)/2 + (star-port) * Math.cos(course+90) / 2;
【讨论】:
1) 这与我的公式相同,但角度方向发生了变化(因为 cos(a+90)=-sin(a) 和 sin(a+90)=cos(a)) 2)你以错误的方式混合度数和弧度以上是关于用坐标、长度、宽度和角度计算矩形的中心的主要内容,如果未能解决你的问题,请参考以下文章
dotnet C# 根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法