【问题标题】:object instances created on xformed and rotated grids在 xformed 和旋转网格上创建的对象实例
【发布时间】:2017-09-14 01:57:50
【问题描述】:

在下面的小提琴中,我在递归树结构的某些点绘制了圆圈。

https://jsfiddle.net/ypbprzzv/4/

树形结构本身是此处的简化版本:

https://processing.org/examples/tree.html

如果不是在 (0, -h) 处在变换和旋转的网格上绘制圆圈,也就是在小提琴中绘制它们的位置,我想挂在未旋转的 y 方向(向下)悬挂的钟摆怎么办? .如果钟摆是对象类的实例,那么添加一个新实例而不是(或除此之外)绘制圆会很容易。

void branch(float h) {
  h *= 0.6;

  if (h > 10) {
    pushMatrix();
    rotate(a);
    line(0, 0, 0, -h);
    fill(0, 175, 0, 100);
    if (h < 50) {
      // I could add a new pendulum here, at (0, -h)
      ellipse(0, -h, 5, 5);
    }
    translate(0, -h);
    branch(h);
    popMatrix();
  } // closing the if statement
} // closing branch function

我已经尝试过了,但是因为我想保持代码非常简短,所以我没有包含它。钟摆确实挂了,但是方向很奇怪,因为当我创建这些实例时,整个网格是 xformed 和旋转的(这需要简化绘制树或其他有趣结构的情况)。

假设我想让这些钟摆对用户交互敏感。对象的参照系与用户不同。

所以我试着总结一下这个问题:

是否可以在经过变换和旋转的网格上创建对象实例,但该对象是否以相对于未旋转网格的规定方式运行?

提供包括钟摆在内的小提琴会有所帮助吗?

【问题讨论】:

    标签: processing processing.js


    【解决方案1】:

    对于一般的“我该怎么做”或“有可能”这样的问题有点难以帮助。很难回答“是否可能”问题的原因是答案几乎总是是的,有可能。同样,“我该怎么做”问题总是有大约一百万个可能的答案,并且没有任何单一的最佳方法来解决问题。 “正确”的答案实际上更多地取决于您对问题的看法,而不是其他任何事情。但我会尽量提供一般意义上的帮助。

    是否可以在经过变换和旋转的网格上创建对象实例,但该对象是否以相对于未旋转网格的规定方式运行?

    是的,这是可能的。

    有很多方法可以解决这个问题:

    • 您可以跟踪当前状态(当前旋转),然后在绘制钟摆时撤消该操作。例如,如果您旋转 90 度,您只需在绘制钟摆之前旋转 -90 度。
    • 您也许可以使用screenX()screenY() 函数来获取转换点的屏幕位置。更多信息请访问the reference
    • 您可以在递归绘制树时存储位置,然后在绘制完树后,您可以遍历这些点以绘制钟摆。

    这些只是我现在能想到的,可能还有更多方法可以解决它。同样,您选择哪种方法实际上取决于这些东西如何融入您的大脑,这很难帮助您。

    但是,如果您想要我的两分钱:我个人发现很难“在转换中思考”来做您所描述的事情。相反,如果我是你,我会重构代码,使其不再依赖于平移和旋转。我会使用基本三角函数(sin()cos() 函数)来绘制所有内容。那么你已经在屏幕坐标中,所以画你的钟摆会容易得多。

    但同样,您采用哪种方法实际上取决于您对事物的看法。

    【讨论】:

    • 根据你的两分钱,我用三角函数完成了一个没有转换的草图:jsfiddle.net/b8jm2ep4/1 因为没有任何东西是 xformed,所以很容易得到我想要的位置。我可能会考虑更普遍地走这条路线,但如果我走 xformation 路线,我仍然对存在哪些选项感兴趣。
    • 根据您的第一个建议,我将尝试为整体 xslation 和旋转添加一个对象属性,并使用它来计算未转换的位置。我对如何使用 screenX/Y 感到困惑。至于第三个,我尝试将位置存储在一个数组中,然后使用该数组创建新实例,但实例都具有相同的坐标(在第一个和静态示例中,它们都在 (0,-h) )。直觉上,我觉得你的第一个建议是我能做的事情,这似乎(在精神上)类似于如何根据 x-y 坐标计算 PImage 对象中像素数组的索引。
    • @Jozurcrunch 这些并不是真正的建议,只是您可能会探索的几个不同选项。但更具体地说,您可能会使用screenX()screenY() 以及存储位置的方法。在将每个点添加到数据结构之前,您需要取消转换,否则,就像您发现的那样,您最终只会多次添加相同的点。重点在“模型空间”,需要先转换为“屏幕空间”再存储。
    • 我试试看。
    • 我想我明白了。我放弃了转换方法。它使绘图更容易,但很难使用我所绘制的内容。相反,我使用了基本触发。它更难绘制,但更容易使用绘制的内容。我会考虑解决这个问题。我使用了 2 种方法:1) 使用递归函数进行触发,以及 2) 每个分支都是一个对象的触发。在这两种情况下,我都可以轻松访问屏幕空间中结构上的任何点。我将编辑我的问题以表明它具有某种解决方案。另外,感谢您的指点;我知道我的问题不够具体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2019-06-05
    • 2022-12-14
    • 1970-01-01
    • 2010-10-04
    • 2021-07-22
    相关资源
    最近更新 更多