Java 用坐标、长度、宽度和角度计算矩形的中心

Java 用坐标、长度、宽度和角度计算矩形的中心,java,geolocation,geometry,Java,Geolocation,Geometry,我想确定旋转矩形的中心。必须首先计算该矩形(见图)。因此,已知从现有坐标p(x1,y1)到所有四个方向的距离(船首、左舷、星形、船尾)。正方形的方向也以度为单位 对我来说,最简单的解决方案是围绕蓝色轴计算一个矩形,然后确定这个矩形的中心。不幸的是,考虑到旋转,我已经在确定正方形的顶点方面遇到了问题 有人知道如何使用这些输入计算顶点的坐标吗(Java中首选)?如果有人知道另一种更简单的方法,我将非常感激。非常感谢 如果star轴相对于OX轴有旋转phi,则其方向向量为 sx, sy = cos(

我想确定旋转矩形的中心。必须首先计算该矩形(见图)。因此,已知从现有坐标p(x1,y1)到所有四个方向的距离(船首、左舷、星形、船尾)。正方形的方向也以度为单位

对我来说,最简单的解决方案是围绕蓝色轴计算一个矩形,然后确定这个矩形的中心。不幸的是,考虑到旋转,我已经在确定正方形的顶点方面遇到了问题


有人知道如何使用这些输入计算顶点的坐标吗(Java中首选)?如果有人知道另一种更简单的方法,我将非常感激。非常感谢

如果
star
轴相对于OX轴有旋转
phi
,则其方向向量为

sx, sy = cos(phi), sin(phi)   //don't forget about radians and degrees
垂直(
bow
direction)向量为

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
备选公式(来源:):


这个问题主要与数学有关,而不是真正的编程问题。应该在math.stackexchange.com上提问。我用以下输入数据检查了一个简单示例的答案: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,by值不同于sx,sy。我只添加了带有sx/sy的最终表达式。对于90:
cx=0+0-1*(-5)=5
是的,对于90°,我和你一样得到值5,但值-5应该出来。此时,点P位于多边形的前部。因此,如果多边形向右看,则该点已向左移动。这将导致90°的-5。反之亦然,270°(向右移动,结果=5)。你明白我对你的解决方案的问题吗?看来你在用另一个角度和方向。例如,您的图片显示的角度约为45度,中心.x肯定位于P正值的右侧。但这不是问题——我只是在最后的公式中改变了符号。1)这和我的公式一样,角度方向也改变了(因为cos(a+90)=-sin(a)和sin(a+90)=cos(a))2)你错误地混合了角度和弧度
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;