在变形和旋转网格上创建的对象实例
object instances created on xformed and rotated grids
在下面的 fiddle 中,我在递归树结构的某些点上绘制了圆圈。
https://jsfiddle.net/ypbprzzv/4/
树结构本身是此处找到的树结构的简化版本:
https://processing.org/examples/tree.html
如果不是在变换和旋转的网格上在 (0, -h) 处绘制圆圈,这是它们在 fiddle 中绘制的位置,我想挂上挂在未旋转的 y 方向(向下)。如果钟摆是一个对象的实例 class,那么添加一个新实例而不是(或除此之外)绘制圆会很容易。
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
我已经试过了,但是因为我想让代码非常简短,所以我没有包含它。钟摆确实挂了,但方向很古怪,因为当我创建这些实例时,整个网格都是变形和旋转的(需要这样才能简化树或其他有趣结构的绘制)。
假设我想让这些钟摆对用户交互敏感。对象的参照系与用户的不同。
所以我会尝试总结这个问题:
是否可以在变换和旋转的网格上创建对象的实例,但该对象相对于未旋转的网格是否以规定的方式运行?
提供包含钟摆的 fiddle 会有帮助吗?
要帮助解决像这样一般的 "how do I do this" 或 "is it possible" 问题有点困难。很难回答 "is it possible" 问题的原因是答案几乎总是 是的,这是可能的。 同样, "how do I do this" 问题总是有大约一百万个可能的答案,并且没有任何单一的最佳方法来解决问题。 "right" 答案实际上更取决于您对问题的看法,而不是其他任何因素。但我会尽力提供一般意义上的帮助。
Is it possible to create instances of objects on a transformed and rotated grid, but have that object behave in a prescribed way in relation to the unrotated grid?
是的,有可能。
您可以通过多种方式解决此问题:
- 您可能会跟踪当前状态(当前旋转),然后在绘制钟摆时撤消它。例如,如果旋转 90 度,则只需旋转 -90 度即可绘制钟摆。
- 您可以使用
screenX()
和 screenY()
函数来获取转换点的屏幕位置。可以在 the reference. 中找到更多信息
- 您可以在递归绘制树时存储位置,然后在绘制树之后,您可以遍历这些点来绘制钟摆。
这些只是我现在能想到的,可能还有更多方法可以实现。同样,您选择哪种方法实际上取决于这些东西如何融入您的大脑,这很难帮助您。
但是如果你想要我的两分钱:我个人发现很难 "think in transformations" 做你描述的事情。相反,如果我是你,我会重构代码,使其不再依赖于平移和旋转。我会使用基本的三角函数(sin()
和 cos()
函数)来绘制所有内容。然后你已经在屏幕坐标中,所以画你的钟摆会容易得多。
但同样,您采用哪种方法实际上取决于您对事物的看法。
在下面的 fiddle 中,我在递归树结构的某些点上绘制了圆圈。
https://jsfiddle.net/ypbprzzv/4/
树结构本身是此处找到的树结构的简化版本:
https://processing.org/examples/tree.html
如果不是在变换和旋转的网格上在 (0, -h) 处绘制圆圈,这是它们在 fiddle 中绘制的位置,我想挂上挂在未旋转的 y 方向(向下)。如果钟摆是一个对象的实例 class,那么添加一个新实例而不是(或除此之外)绘制圆会很容易。
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
我已经试过了,但是因为我想让代码非常简短,所以我没有包含它。钟摆确实挂了,但方向很古怪,因为当我创建这些实例时,整个网格都是变形和旋转的(需要这样才能简化树或其他有趣结构的绘制)。
假设我想让这些钟摆对用户交互敏感。对象的参照系与用户的不同。
所以我会尝试总结这个问题:
是否可以在变换和旋转的网格上创建对象的实例,但该对象相对于未旋转的网格是否以规定的方式运行?
提供包含钟摆的 fiddle 会有帮助吗?
要帮助解决像这样一般的 "how do I do this" 或 "is it possible" 问题有点困难。很难回答 "is it possible" 问题的原因是答案几乎总是 是的,这是可能的。 同样, "how do I do this" 问题总是有大约一百万个可能的答案,并且没有任何单一的最佳方法来解决问题。 "right" 答案实际上更取决于您对问题的看法,而不是其他任何因素。但我会尽力提供一般意义上的帮助。
Is it possible to create instances of objects on a transformed and rotated grid, but have that object behave in a prescribed way in relation to the unrotated grid?
是的,有可能。
您可以通过多种方式解决此问题:
- 您可能会跟踪当前状态(当前旋转),然后在绘制钟摆时撤消它。例如,如果旋转 90 度,则只需旋转 -90 度即可绘制钟摆。
- 您可以使用
screenX()
和screenY()
函数来获取转换点的屏幕位置。可以在 the reference. 中找到更多信息
- 您可以在递归绘制树时存储位置,然后在绘制树之后,您可以遍历这些点来绘制钟摆。
这些只是我现在能想到的,可能还有更多方法可以实现。同样,您选择哪种方法实际上取决于这些东西如何融入您的大脑,这很难帮助您。
但是如果你想要我的两分钱:我个人发现很难 "think in transformations" 做你描述的事情。相反,如果我是你,我会重构代码,使其不再依赖于平移和旋转。我会使用基本的三角函数(sin()
和 cos()
函数)来绘制所有内容。然后你已经在屏幕坐标中,所以画你的钟摆会容易得多。
但同样,您采用哪种方法实际上取决于您对事物的看法。