【发布时间】:2012-11-25 13:15:18
【问题描述】:
目前我有一个简单的动画,其中一辆汽车 (JPanel) 接近一个路口,然后等待红绿灯变绿并继续直行。但是,我现在要进行下一步,我希望汽车以平滑的曲线向右转 90 度以转向垂直的道路。我已经大致勾勒了它的外观,曲线代表了我希望汽车转向的方式:
我不太确定该怎么做。我想我需要代表某种贝塞尔曲线?或者矩阵变换来旋转汽车?
有人可以就在 Swing 中执行此操作的最佳方式提供建议吗?
【问题讨论】:
目前我有一个简单的动画,其中一辆汽车 (JPanel) 接近一个路口,然后等待红绿灯变绿并继续直行。但是,我现在要进行下一步,我希望汽车以平滑的曲线向右转 90 度以转向垂直的道路。我已经大致勾勒了它的外观,曲线代表了我希望汽车转向的方式:
我不太确定该怎么做。我想我需要代表某种贝塞尔曲线?或者矩阵变换来旋转汽车?
有人可以就在 Swing 中执行此操作的最佳方式提供建议吗?
【问题讨论】:
如果您不熟悉 Java 图形,我推荐this tutorial。如果我要对你正在做的事情进行编码,我会看到两个选项。
首先也是最简单的,您可以将转弯建模为“首先直行,然后沿着以我正在转弯的拐角为中心的圆的边缘转弯 90º,然后再次直行”。最简单的方法是定义一个JPanel 来绘制你的Image(是的,一个JPanel;如果你不绘制它们的背景,你可以将JPanel 层叠在一起——它们将被绘制在正确的顺序;使背景JPanel 不透明,以便在绘制下一帧之前清理干净),并给它一个AffineTransform,使图像显示在您想要的位置。您将需要调整变换中的增量,以使速度看起来恒定;反复试验,或一些几何学(半径 R 的 90º 意味着 R*pi/2.0 沿着弯曲路径的总行程),将帮助您。
困难的方法是将汽车的路线视为任意Shape(例如,您可以使用贝塞尔曲线定义),从中提取一个扁平的PathIterator,沿着该迭代器以等间距跳跃前进,并从沿曲线的位置和任何给定点的航向计算您需要的旋转(您可以通过连续采集 2 个样本来估计航向,并根据这些样本对齐汽车)。这比使用上述方法更难,但允许您的汽车遵循任意复杂的路径。
【讨论】: