【问题标题】:Draw rectangle line by line逐行绘制矩形
【发布时间】:2013-10-07 10:41:07
【问题描述】:

我想用Java 中的hlinevline 绘制矩形。我在绘制它时遇到了一些问题,我不太清楚,但我认为它在 hline1vline1 方法上。

没有错误,只是参数内部算法有问题。

这里是代码..

 package hw1;
 import java.awt.*;
 import java.awt.geom.*;
 import java.awt.event.*;

 public class main extends Frame {

Graphics2D g2d;
main()
{
    addWindowListener(new hw1.main.MyFinishWindow());
}

public class MyFinishWindow extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }
}

public void paint (Graphics g)
{
    g2d=(Graphics2D)g;

    hline(0,40,250,40);
    vline(250,40 , 250 , 80);
    hline1(250,80,0,80);
    vline1(0,80 , 0 , 40);

}

public void hline(int x1,int y1 , int x2 , int y2)
{
    for(int x=x1 ; x<=x2 ; x++)
        putpixel(x,y1,Color.blue);
}

public void vline(int x1 ,int y1 , int x2 , int y2 )
{
    for(int y=y1;y<=y2;y++)
        putpixel(x1,y,Color.blue);
}

 public void hline1(int x1,int y1 , int x2 , int y2)
{
    for(int x=x1 ; x<=x2 ; x++)
        putpixel(x,x1,Color.blue);
}

public void vline1(int x1 ,int y1 , int x2 , int y2 )
{
    for(int y=y1;y<=y2;y++)
        putpixel(x1,y,Color.blue);
}

public void putpixel(int x , int y , Color c)

{
    g2d.setColor(c);
    g2d.drawLine(x, y, x, y);
}

 public void putpixel(int x , int y , Color c , int rad)
 {
     g2d.setColor(c);
     if(rad>4) rad=4;
     if(rad<=0) rad=1;
     g2d.drawOval(x-rad/2, y-rad/2, rad, rad);
 }


public static void main(String[] args) {
    // TODO code application logic here

    main f=new main();
    f.setTitle("Computer Graphics:Java 2D prpgram");
    Dimension screenSize=
            Toolkit.getDefaultToolkit().getScreenSize();
    int width=(int) screenSize.getWidth();
    int height=(int) screenSize.getHeight();
    f.setSize(width, height);
    f.setVisible(true);
}

}

【问题讨论】:

  • 为什么选择 AWT 而不是 Swing?请参阅Swing extras over AWT 上的此答案,因为有很多放弃使用 AWT 组件的充分理由。如果您需要支持较旧的基于 AWT 的 API,请参阅 Mixing Heavyweight and Lightweight Components
  • “我想用 Java 中的 hlinevline 绘制矩形。” 顺便说一句 - 为什么特别是这样,而不是(现在是 2)其他好的画盒子的方法?如果是“老师指定的”,最好说清楚。程序员在编程时倾向于“使用最简单的工具”,而你的方法不是最简单的方法。

标签: java user-interface awt java-2d


【解决方案1】:

主要问题是你总是增加循环变量 - 没有考虑哪个边界值大于另一个......

   vline1(0,80 , 0 , 40);

这将从 80 开始 y,然后递增直到它达到 40...

这至少做了它应该做的事情

public void vline(int x1 ,int y1 , int x2 , int y2 )
{
    //use min and max
    for(int y=Math.min(y1, y2);y<=Math.max(y1,y2);y++) { //always use brackets!!!
        putpixel(x1,y,Color.blue);
    }
}

另外,一定要为 hline() 实现这个...

其他问题

  • 垂直线不需要两个函数,水平线不需要两个函数。方法的目的是重用代码 - 如果您出于某种我们不知道的原因想要保留此结构,请将 1 个函数用于水平线,将一个函数用于垂直线。
  • 方法中不应有任何未使用的参数。

    hline(y, x1, x2)
    vline(x, y1, y2)
    

    完全够用了。

  • 更不用说,把它提升到一个新的水平:有一种方法来处理各种线条会很棒:那就是drawLine(),就像 @ling.s 指出。并且可以正确处理各种行...

故事的寓意:了解您的 API,并且不要重新发明轮子(除非这是为了学校,那里的任务是重新发明它......)

【讨论】:

  • 解决方案必须没有任何额外的功能,我认为问题在于 hline1 和 vline1 的 putpixel fun ,如何在其中调用 putpixel fun 。可以用 y 替换 x1 ,就像这样。
【解决方案2】:

试试drawLine()

public void paint (Graphics g)
{
g2d=(Graphics2D)g;

g.drawLine(0,40,250,40);
g.drawLine(250,40 , 250 , 80);
g.drawLine(250,80,0,80);
g.drawLine(0,80 , 0 , 40);

}

【讨论】:

  • 我们必须使用hline和vline的算法,我们不能使用drawline fun。
【解决方案3】:

作为旁注,您可以使用java.awt.Polygon

  Polygon p;

   p = new Polygon();
   p.addPoint(10, 10);
   p.addPoint(100,10);       
   p.addPoint(100,100);
   p.addPoint(10,100);

 .....

  public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(Color.white);
    g.fillPolygon(p);   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多