用Java从一个角度画线

用Java从一个角度画线,java,swing,awt,Java,Swing,Awt,首先,我必须说这是一个转载。我以前的帖子被标记为重复,尽管我在编辑中非常清楚地说了为什么这篇文章与另一篇不同,但似乎没有人会访问它。这个问题仍然是完全正确的,完全没有答案,所以请不要仅仅因为其他人也在和Pacman玩游戏就把它标记为重复的。如果我纠正这个错误的方法是错误的,请原谅我,并告诉我正确的方法来解决这样的问题,因为我仍然很少知道这个网站是如何运作的 我以前的帖子如下: import java.awt.*; public class Corridor { public Corridor()

首先,我必须说这是一个转载。我以前的帖子被标记为重复,尽管我在编辑中非常清楚地说了为什么这篇文章与另一篇不同,但似乎没有人会访问它。这个问题仍然是完全正确的,完全没有答案,所以请不要仅仅因为其他人也在和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);
}
}
我正在制作一款以吃豆人为主题的乒乓球游戏。为了增加主题,我想在Pacman面对的角度画两条线,一条在球的两边。我把所有东西都放在一个JPanel中,因为我的教育还没有达到使用组件的程度。我试图创建一个从我的Pacman获取参数的走廊对象,但我不知道如何执行trig。我的帧是1000乘1000,顶部40个像素高的栏用于显示数据。我的“吃豆人”以度为单位给出信息,所以请在回答中说明这一点。谢谢你,我会尽力回答你的任何问题

更新:我已经做了一些工作,我有一些关于这个主题的代码可以分享。详情如下:

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);
}
}
我尝试使用一种新策略来获取线条(出现在drawLines方法中):

这种方法是试图画一条直线穿过吃豆人的路径。我的想法是,如果我能做到这一点,我可以通过分别增加和减少第1行和第2行的y点来实现墙。它在90的每一个倍数(包括0)中似乎都工作得很好。然而,它在所有其他角度都以一种非常奇怪的方式工作。我能提供的唯一具体情况是,它在45度处垂直。此外,线路在移动,这一点也不可取。这段代码也损害了我的愿望,让端点直接在墙上。请允许我详细说明我的课程目标:

  • 感觉吃豆人的正确角度
  • 画两条平行于吃豆人路径的线,这样吃豆人就不会 随时与他们拦截。这些线路最好有 以下四条线中至少两条线上的端点:x=0,x= 1000,y=40,y=1000
  • 无论吃豆人的X&Y是什么,都要画相同的线。换句话说,这些线不应该因为吃豆人沿着路径前进的任何变化而改变
  • 当吃豆人的角度改变时,线条会改变以反映这种变化。无论是否在每次调用中运行计算,只要结果正确,即存在角度正确的静态(非移动)线路,这都无关紧要 多谢各位

    更新(重新发布时): 自上次更新以来,我的最佳代码没有更改。然而,我已经思考了为什么它不起作用,并提出了以下假设:它在90度倍数上的作用和在其他角度上的作用一样可怕。然而,角度的性质使我看不到线在移动。因此,我必须猜测代码是有缺陷的,因为它无法忽略Pacman的运动

    更新: 为了响应我多次收到的图片请求,我从VGR的优秀代码工作的少数几个角度中的一个角度进行了此操作。
    正如我所说,代码以90度的倍数工作,比如上面的一个,但不能正确地渲染所有其他角度。作为对VGR评论的回应,当吃豆人的x和y改变时,它们从不移动(因为它们不必移动),但会随着吃豆人角度的改变而移动。把这些线想象成走廊的墙,总是移动到Pacman需要去的地方。当“吃豆人”沿着走廊走下去时,他们永远不会移动,但一旦他到达一个死胡同,走廊就会移动以适应他的新方向。我真诚地希望这能有所帮助

    你的想法是对的:

    Shape originalClip = myBuffer.getClip();
    myBuffer.clipRect(0, 40, 1000, 1000 - 40);
    
    double x = pm.getX();
    double y = pm.getY();
    double angle = Math.atan2(pm.getdy(), pm.getdx());
    double dx = PACMAN_RADIUS * Math.sin(angle);
    double dy = PACMAN_RADIUS * Math.cos(angle);
    
    double x1 = x - dx;
    double x2 = x + dx;
    double y1 = y - dy;
    double y2 = y + dy;
    
    myBuffer.setColor(Color.BLUE);
    
    myBuffer.drawLine((int) (x1 - 5000 * dy),
                      (int) (y1 + 5000 * dx),
                      (int) (x1 + 5000 * dy),
                      (int) (y1 - 5000 * dx));
    
    myBuffer.drawLine((int) (x2 - 5000 * dy),
                      (int) (y2 + 5000 * dx),
                      (int) (x2 + 5000 * dy),
                      (int) (y2 - 5000 * dx));
    
    myBuffer.setClip(originalClip);
    
    一些注意事项:

    • 用于确保线不会在y=40以上绘制
    • 仅将角度转换回弧度是没有意义的
    • 期望dy作为第一个参数,dx作为第二个参数

      • 你的想法是对的:

        Shape originalClip = myBuffer.getClip();
        myBuffer.clipRect(0, 40, 1000, 1000 - 40);
        
        double x = pm.getX();
        double y = pm.getY();
        double angle = Math.atan2(pm.getdy(), pm.getdx());
        double dx = PACMAN_RADIUS * Math.sin(angle);
        double dy = PACMAN_RADIUS * Math.cos(angle);
        
        double x1 = x - dx;
        double x2 = x + dx;
        double y1 = y - dy;
        double y2 = y + dy;
        
        myBuffer.setColor(Color.BLUE);
        
        myBuffer.drawLine((int) (x1 - 5000 * dy),
                          (int) (y1 + 5000 * dx),
                          (int) (x1 + 5000 * dy),
                          (int) (y1 - 5000 * dx));
        
        myBuffer.drawLine((int) (x2 - 5000 * dy),
                          (int) (y2 + 5000 * dx),
                          (int) (x2 + 5000 * dy),
                          (int) (y2 - 5000 * dx));
        
        myBuffer.setClip(originalClip);
        
        一些注意事项:

        • 用于确保线不会在y=40以上绘制
        • 仅将角度转换回弧度是没有意义的
        • 期望dy作为第一个参数,dx作为第二个参数

        有几件事:首先:谢谢!这是迄今为止我在这个社区得到的最有帮助的回应。其次,我试图实现您的注释,即atan2在我的代码中接受dy作为第一个,dx作为第二个,但似乎没有任何效果。当我把dx作为第一个参数时,我不得不在fillArc方法中偏移90,但这是完全可靠的。无论我尝试何种变体,dy作为第一个参数都会产生不恰当的结果。在主要关注点的主题上,这两行呈现得非常好,它们完美地满足了代码目标4的要求,部分地满足了代码目标2的要求。很可能#1也是合适的,但没有直观的结论性方法来推断。问题在于:1)线条在视觉上是移动的,2)线条肯定不是根据Pacman的角度量身定做的。虽然吃豆人几乎肯定不会触碰这些线(因此部分实现了#2),但这是因为这些线一直在运动,试图超越他的能力范围。可能的原因是什么?很难理解你的目标。如果直线从未移动,您希望它们的端点在哪里?如果它们从不移动,当吃豆人改变方向时,它们怎么能与吃豆人平行?也许您可以创建一个显示所需行为示例的图像?如果更新没有回答您的问题,请告诉我需要什么。您说“当Pacman的x和y发生变化时,请不要移动(因为它们会移动)”