Math 知道一个长方形的两点,我怎么才能算出另外两点呢?

Math 知道一个长方形的两点,我怎么才能算出另外两点呢?,math,geometry,trigonometry,processing.js,Math,Geometry,Trigonometry,Processing.js,嘿,伙计们,我正在学习processing.js,我遇到了一个数学问题,用我有限的几何学和三角学知识,或者借助维基百科,我似乎无法解决这个问题 我需要画一个矩形。要画这个矩形,我需要知道每个角的坐标点。我只知道盒子顶部和底部中点的x和y,以及所有四条边的长度 不能保证盒子的方向 有什么帮助吗?这似乎应该很容易,但它真的让我难堪 它肯定是一个矩形?然后知道短边的方向(它们与点之间的线平行),从而知道长边的方向 你知道长边的方向和长度,你知道它们的中点,所以从那里很容易找到角 实现留给读者作为练习。

嘿,伙计们,我正在学习processing.js,我遇到了一个数学问题,用我有限的几何学和三角学知识,或者借助维基百科,我似乎无法解决这个问题

我需要画一个矩形。要画这个矩形,我需要知道每个角的坐标点。我只知道盒子顶部和底部中点的x和y,以及所有四条边的长度

不能保证盒子的方向


有什么帮助吗?这似乎应该很容易,但它真的让我难堪

它肯定是一个矩形?然后知道短边的方向(它们与点之间的线平行),从而知道长边的方向

你知道长边的方向和长度,你知道它们的中点,所以从那里很容易找到角


实现留给读者作为练习。

这意味着在两点之间将有两条平行线。通过平移垂直于直线的每一个方向上有1/2顶边长度的直线来获得角点。

如果知道顶部的中点和顶部的长度,则知道两个顶角的y将保持不变,x将是中点加/减矩形的宽度。底部也是如此

一旦有了四个角,就不必担心边长,因为它们的点与用于顶部和底部的点相同

                         midpoint
     x,10                 10,10                   x,10
      *--------------------------------------------*
                         width = 30

    mx = midpoint x.
    top left corner = (w/2) - mx  or 15 - 10
    top left corner coords = -5,10

    mx = midpoint x.
    top right corner = (w/2) + mx  or 15 + 10
    top left corner coords = 25,10

“四边形”和“矩形”之间有区别

如果有顶部和底部的中点,以及边的长度,那么剩下的就很简单了

鉴于:

(x1, y1) -- (top_middle_x, top_middle_y) -- (x2, y1)

(x1, y2) -- (btm_middle_x, btm_middle_y) -- (x2, y2)
顶部/底部长度以及右侧/左侧长度

x1=顶部\中间\ x-顶部/底部\长度/2; x2=x1+顶部/底部长度

y1=顶部\中间\ y y2=底部\中间\ y

显然,这是最简单的情况,假设(tmx,tmy)(bmx,bmy)的线只沿着Y轴

我们称之为“中线”

下一个技巧是取中线,并计算其相对于Y轴的旋转偏移

现在,我的三角架生锈了

dx=tmx-bmx,dy=tmy-bmy

所以,角度的切线是dy/dx。反正切(dy/dx)是直线的角度

从中你可以得到你的方向

(请注意,有些游戏使用象限、符号等来实现这一点,但这是游戏的要点。)

确定方向后,可以将直线“旋转”回Y轴。查找二维图形的数学,这是直截了当的

这样你就有了正常的方向。然后以新的法线形式计算矩形点,最后将其旋转回去

中提琴。矩形


您可以做的其他事情是“旋转”一条长度为“顶”线一半的线,使其与中线成90度角。假设你有一条45度的中线。您可以从tmx、tmy开始这条线,然后将这条线旋转135度(90+45)。那一点就是你的“左上角”。旋转-45(45-90)以获得“右上角”点。然后对下面的点做类似的操作。

如果这个四边形是一个矩形(所有四个角都是90度),那么它可以被求解。(如果它可以是任何四边形,那么它是不可解的)

如果点是(x1,y1)和(x2,y2),并且如果两点不是完全垂直(x1=x2)或水平(y1=y2),则矩形一条边的坡度为

m1 = (y2-y1) / (x2-x1) 
另一边的坡度为:

m2 = - 1 / m1
如果您知道边的长度以及两条相对边的中点,则可以通过向中点添加dx,dy来轻松确定对应点:(如果L是中点所在边的长度)


注意:如果这些点是垂直或水平对齐的,这种技术将不起作用,尽管这些退行性病变的明显解决方案要简单得多

使用应用于两个中点之间的向量的反正切函数,计算连接两个中点的直线的角度

从该角度减去90度以获得上边缘的方向

从顶部中心点开始,相对移动(1/2顶部宽度x sin(角度),1/2顶部宽度x cos(角度))-获得右上角点

根据需要使用角度和宽度的正弦和余弦继续围绕矩形


作为测试:检查是否回到起点

如果知道四边形是矩形,则可以使用一些简单的向量数学来查找角点的坐标。已知的是:

  • (x1,y1)
    -顶线上中点的坐标
  • (x2,y2)
    -底线中点的坐标
  • l1
    -顶行和底行的长度
  • l2
    -其他两行的长度
首先,我们找到两个已知点之间的向量。该矢量与边线平行:

(vx,vy)=(x2-x1,y2-y1)

我们需要规范化这个向量(即,使它的长度为1),以便我们以后可以使用它作为找到坐标的基础

vlen=sqrt(vx*vx+vy*vy)

(v1x,v1y)=(vx/vlen,vy/vlen)

接下来,我们将这个向量逆时针旋转90度。旋转的矢量将与顶线和底线平行。90度旋转只不过是交换坐标并对其中一个求反。你只要在纸上试一下就可以看出这一点。或者在90度内观察并替换

(u1x,u1y)=(-v1y,v1x)

现在我们有足够的信息找到“左上角”。我们只需从我们的点开始
(x1,y1)
dx = Sqrt( L^2 / (1 + m2^2) ) / 2
dy = m2 * dx
/* rcx = center x rectangle, rcy = center y rectangle, rw = width rectangle, rh = height rectangle, rr = rotation in radian from the rectangle (around it's center point) */

function toRectObjectFromCenter(rcx, rcy, rw, rh, rr){
    var a = {
        x: rcx+(Math.sin((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2)), 
        y: rcy-(Math.cos((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2))
    };
    var b = {
        x: a.x+Math.cos(rr)*rw,
        y: a.y+Math.sin(rr)*rw
    };
    var c = {
        x: b.x+Math.cos(degToRad(radToDeg(rr)+90))*rh,
        y: b.y+Math.sin(degToRad(radToDeg(rr)+90))*rh
    };
    var d = {
        x: a.x+Math.cos(degToRad(radToDeg(rr)+90))*rh,
        y: a.y+Math.sin(degToRad(radToDeg(rr)+90))*rh
    };
    return {a:a,b:b,c:c,d:d};
}
  function getFirstPoint(x1,y1,x2,y2,l1,l2)
    distanceV = {x2 - x1, y2 - y1}
    vlen = math.sqrt(distanceV[1]^2 + distanceV[2]^2)
    normalized = {distanceV[1] / vlen, distanceV[2] / vlen}
    rotated = {-normalized[2], normalized[1]}
    p1 = {x1 - rotated[1] * l1 / 2, y1 - rotated[2] * l1 / 2}
    p2 = {p1[1] + rotated[1] * l1, p1[2] + rotated[2] * l1}
    p3 = {p1[1] + normalized[1] * l2, p1[2] + normalized[2] * l2}
    p4 = {p3[1] + rotated[1] * l1, p3[2] + rotated[2] * l1}
    points = { p1 , p2 , p3 , p4}
    return p1
end