【问题标题】:Point rotation relative to image coordinates相对于图像坐标的点旋转
【发布时间】:2010-12-22 11:40:52
【问题描述】:

我正在使用 Web 界面为我的本地照片创建一个数据库,我希望能够在其中标记图像并旋转它们,等等。在实现标签(就像 Facebook 的标签系统一样)时,我遇到了一个有问题的领域。即:

假设我标记了(不是)我的图像:

当我旋转它时,我希望标签坐标随图像一起旋转,如下所示:

这是我的问题。我将坐标存储在 CSS 坐标系中的数据库 (x, y) 中,即左/上而不是数学左/下。 (这可能不是什么大问题?)

下一个大问题是,当我围绕中心(点 [0,0])旋转时,我得到负坐标。例如,从 [100, 100] 到 [-100, -100]。这是不正确的,因为当我旋转图像时,我没有得到负坐标。坐标系只是正的。

我所有的旋转代码都使用了矢量旋转公式:

$nx = $x * cos(deg2rad($rotation_angle)) - $y * sin(deg2rad($rotation_angle));
$ny = $x * sin(deg2rad($rotation_angle)) + $y * cos(deg2rad($rotation_angle));

我的问题是:我该如何解决这个问题?我曾尝试仅使用abs 将负值变为正值,但会导致坐标错误。

【问题讨论】:

    标签: math tags rotation coordinates


    【解决方案1】:

    如果您的旋转仅以 90 度为步长,如此处所示,那么答案相当简单。诀窍是您并没有在固定的参考框架内旋转坐标本身,您只是在更改测量它们的参考框架。 (嗯,两者是等价的,但在我看来,这是一种更简单的可视化方式。)

    在您的原件中,x 从左边缘向右测量,y 从上边缘向下测量。旋转后,边缘的位置发生了变化,因此您现在需要计算出同一点相对于这个新框架的位置。所以 new x 是从 new 左边缘向右的距离,它曾经是底部;而新的y 是从新的顶部边缘向下的距离,它曾经是左边。即:

    $ny = $x;
    $nx = $height - $y;
    

    将此扩展到 180 度和 270 度旋转应该是相当明显的。

    如果您需要处理部分旋转,那么问题会稍微复杂一些,因为您必须定义与页面对齐而不是与图像边缘对齐的坐标轴,并且您可以选择如何偏移它们。如果是这种情况,请发表评论,我稍后会尝试填写更多详细信息。

    【讨论】:

    • 我只能旋转 +90 或 -90 度,所以我只需要检查这两个条件,还是根据它是 180 -> 270 旋转和 0 - > 90 转?感谢您的精彩回复。
    • @Erik 你只需要检查这两个 - 如果你对它有血腥的想法,你甚至可以只用 +90 构建所有东西,因为 -90 与 +90 +90 相同+90。只要确保将旋转链接在一起时,将它们应用于任何先前旋转的结果而不是原始坐标 - 即$x = $nx; $y = $ny;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2011-07-24
    • 2013-05-12
    • 2012-08-30
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多