Java中从特定角度绘制线条

时间:2016-03-23 14:10:18

标签: java swing

注意:对于能够删除副本的人,请参阅第三次更新。

我正在创造一个Pacman主题乒乓球游戏。为了增加主题,我想在Pacman所面对的角度绘制两条线,一条在球的两侧。我把所有东西放在一个JPanel中,因为我没有达到使用组件的教育点。我试图创建一个走廊对象,从我的Pacman中获取参数,但我不知道怎么做trig。我的框架是1000 x 1000,顶部有40个像素的条形图,用于显示数据。 My Pacman以度为单位提供信息,因此请在答案中说明。谢谢,我会尽力回答任何问题。

更新: 我做了一些工作,我已经有一些代码可以分享这个主题了。它在下面:

import java.awt.*;
public class Corridor
{
public Corridor()
{

}
public void drawLines(Graphics myBuffer, BallPacman pm)
{
    double x1 = pm.getX();
    double y1 = pm.getY() + 150;
    double ix = pm.getdx();
    double iy = pm.getdy();
    double x2 = pm.getX();
    double y2 = pm.getY() + 150;
        if (iy < 0) {
            while (x1 > 0 && y1 > 40) {
                x1 -= 0.1;
                y1 -= 0.1 * (iy / ix);
            }
            if (x1 <= 0)
            {
                y1 += (0 - x1) * (iy / ix);
                x1 = 0;
            }
            else {
                x1 += (40 - y1) * (iy / ix);
                y1 = 40;
            }
            while (x2 < 1000 && y2 < 1000) {
                x2 += 0.1;
                y2 += 0.1 * (iy / ix);
            }
            if (x2 >= 1000) {
                y2 -= (x1 - 1000) * (iy / ix);
                x2 = 1000;
            }
            else {
                x2 -= (1000 - y2) * (iy / ix);
                y2 = 1000;
            }
        }
        else {
            while (x1 > 0 && y1 > 40) {
                x1 -= 0.1;
                y1 -= 0.1 * -(iy / ix);
            }
            if (x1 <= 0)
            {
                y1 += (0 - x1) * -(iy / ix);
                x1 = 0;
            }
            else {
                x1 += (40 - y1) * -(iy / ix);
                y1 = 40;
            }
            while (x2 < 1000 && y2 < 1000) {
                x2 += 0.1;
                y2 += 0.1 * -(iy / ix);
            }
            if (x2 >= 1000) {
                y2 -= (x2 - 1000) * -(iy / ix);
                x2 = 1000;
            }
            else {
                x2 -= (y2 - 1000) * -(iy / ix);
                y2 = 1000;
            }
        }
    myBuffer.setColor (Color.BLUE);
    myBuffer.drawLine ((int)x1, (int)y1, (int)x2, (int)y2);
}
}

不幸的是,这会产生奇怪的结果,例如移动和垂直线。我意识到它只产生一条线,但它是一种测试。 BallPacman有一个移动方法,每次调用一个定时器时都会移动它dx和dy。 dx和dy可能是正面的也可能是负面的。

更新: 我问过我的一位朋友,他说基本上我想要的是两条线与Ballpacman所遵循的线平行。不幸的是,我不知道如何实现这个结果。

更新: 这完全是另一个问题的副本。另一个问题是关于绘制Pacman本人,我不需要。这个问题是关于如何使用三角法找到Pacman方向的平行线,并找到代码绘制它。我想请社群中的人有权删除此问题的重复状态。我想强调的是,我使用的是单个组件,其中的对象知道如何绘制自己。 在我进行更新时,我想发布一些新的和额外的代码: 我用来获取角度的方法(输入dx和dy):

public double getFAngle (double x, double y)
{
    return Math.toDegrees(Math.atan2(x, y));
}

我试图用来获取该行的新策略(存在于drawLines方法中):

double angle = pm.getFAngle (pm.getdx(), pm.getdy());
int x1 = (int) (pm.getX() + 5000 * Math.cos (angle * Math.PI / 180));
int x2 = (int) (pm.getX() - 5000 * Math.cos (angle * Math.PI / 180));
int y1 = (int) (pm.getY() + 5000 * Math.sin (angle * Math.PI / 180));
int y2 = (int) (pm.getY() - 5000 * Math.sin (angle * Math.PI / 180));
myBuffer.setColor (Color.BLUE);
myBuffer.drawLine (x1, y1, x2, y2);

这种方法试图制作一条直接通过Pacman路径的线。我的想法是,如果我能做到这一点,我可以通过简单地增加和减少第1行和第2行的y点来实现墙壁。它在90的每个倍数中都表现得非常完美,包括0.然而,对于所有其他角度,它以非常奇怪的方式工作。我能提供的唯一具体是它在45度时垂直。此外,线条正在移动,这至少是不可取的。这段代码也影响了我将端点直接放在墙上的愿望。 请允许我详细说明我的计划的目标:

  1. 感受Pacman的角度和方向
  2. 绘制两条平行于Pacman路径的线,这样Pacman就不会在任何时候拦截它们。优选地,这些线将在以下四条线中的至少两条线上具有端点:x = 0,x = 1000,y = 40,y = 1000;
  3. 无论Pacman的X&amp;换句话说,由于Pacman在路径上的进展发生任何变化,线条不应该改变。
  4. 当Pacman的角度发生变化时,线条会发生变化以反映出这种变化。只要结果是正确的,每次调用是否运行计算都无关紧要。
  5. 谢谢。

0 个答案:

没有答案