【问题标题】:transformation of evenly spaced rectangular set of point等距矩形点集的变换
【发布时间】:2020-08-04 08:00:56
【问题描述】:

我有一组均匀分布的点,形成一个矩形(抱歉画的不好,想象所有点都是均匀分布的),并应用一个角度,我想从左图转到右图。唯一不动的点是左下角和右上角。

我想我可以使用切线推断出每个点的新位置来得到 dx 和 dy。但我不确定我最终会得到我想要的。并且可能对每个点都应用更优雅的转换?

【问题讨论】:

    标签: geometry trigonometry transformation


    【解决方案1】:

    所以我们要保留两个相对的矩形顶点和它们之间的对角线。

    设矩形的半宽为w,半高为h,圆半径为r。设坐标原点在圆心。

    对角线和OX的夹角是

    theta = atan(h/w)
    

    新矩形的对角线和下边之间的转换角度为

    fi = alpha + theta
    

    所以我们可以找到新矩形的半角

    nw = r * cos(fi)
    

    平移后的顶点坐标为

    2*nw*cos(alpha) - w, -h - 2*nw*sin(alpha)
    

    我们想找到仿射变换M,将两个顶点变换为相同的点,将第三个顶点变换为上面的坐标

        |-w  w   w|   |-w  w  2*nw*cos(alpha) - w |
    M * |-h  h  -h| = |-h  h  -h - 2*nw*sin(alpha)|
        |1   1   1|   |1   1                     1|
    

    为了找到M,我们对左矩阵求逆,并将两边乘以这个逆。

    M = |nw*cos(alpha)/w     w/h - nw*cos(alpha)/h    0|
        |-nw*sin(alpha)/w    1 +  nw*sin(alpha)/h     0|
        |0                   0                        1|
    

    现在我们可以用这个矩阵变换所有坐标,得到旋转的矩形。

    我的Delphi程序生成的坐标转换示例如下:

      nX := Round(cx + x * cos(alpha)*nw/w + y * (w/h - cos(alpha)*nw / h));
      nY := Round(cy - x * nw/w*sin(alpha) + y * (1 + nw/h * sin(alpha)));
    

    【讨论】:

    • 不可能?这当然不是简单的旋转,但可能有一些自适应的东西可以移动点,比如它到矩形对角线或其他东西的距离!?我实际上已经按照你的建议做了,但它不符合我的需要。也许我可以添加一个拉伸/收缩轴的其他转换
    • 所以你想保留一条对角线的准确位置并改变矩形的纵横比?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多