⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawpanel.java

📁 实现二维基本图元直线段生成的基本算法(DDA
💻 JAVA
字号:
package graphics0;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.awt.image.*;

/**
 * <p>Title: computer graphics </p>
 * <p>Description: homeworks</p>
 * <p>Copyright: Copyright (c) 2004 </p>
 * <p>Company: shu</p>
 * @author dxf
 * @version 1.0
 */

public class DrawPanel
    extends JPanel {
  BufferedImage bi;
  Graphics2D big;
  Vector v2D,vp;
  int clickCount, lWidth, lStyle;
  Color FrColor, BkColor;
  Point spoint, epoint,p0;
  int iObject, iLine, iSelect;
  int iFillMethod, iClipMethod;

  Frame frame;

  public DrawPanel(Frame f) {
    v2D = new Vector();
    frame = f;
    spoint = new Point(0, 0);
    epoint = new Point(0, 0);
    FrColor = Color.BLACK;
    BkColor = Color.WHITE;

    bi = new BufferedImage(Object2D.cWidth, Object2D.cHeight, BufferedImage.TYPE_INT_RGB);
    big = bi.createGraphics();
    big.setBackground(BkColor);
    big.clearRect(0, 0, Object2D.cWidth, Object2D.cHeight);

    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        panel_mousePressed(e);
        panel_mouseClicked(e);
      }
    });

  }

////////////////////////////////////////////////////////////////////
  public void Clear() {
    v2D.clear();
    clickCount = 0;
    big.clearRect(0, 0, Object2D.cWidth, Object2D.cHeight);
    if (frame.jCheckBoxMenuItemDemo.isSelected()) {
      DrawGrid();
    }
    repaint();
  }

///////////////////////////////////////////////////////////////////////
  public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2D = (Graphics2D) g;
    g2D.drawImage(bi, 0, 0, this);
  }

/////////////////////////////////////////////////////////////////////
  public void panel_mouseClicked(MouseEvent e) {
    if (2==e.getClickCount()) {
      v2D.addElement(new PolygonDx(vp));
      vp.add(new Point(e.getPoint()));
      DrawPloygon((Point)(vp.lastElement()),(Point)(vp.firstElement()));
      vp.clear();
      clickCount = 0;
    }
    if (frame.jTBtnCentre.isSelected()) {
      frame.jTFCX.setText(Integer.toString(e.getPoint().x));
      frame.jTFCY.setText(Integer.toString(e.getPoint().y));
    }
  }

//////////////////////////////////////////////////////////////////////
  public void panel_mousePressed(MouseEvent e) {
    Graphics g = this.getGraphics();
    clickCount++;
    g.drawString(e.getX() + "," + e.getY(), e.getX(), e.getY());
    //////////////////////////////////////////////////////////
    //Line,circle,ellipse
    if (0 == iSelect) {
      if (clickCount == 1) {
        spoint = e.getPoint();
      }
      if (clickCount == 2) {
        epoint = e.getPoint();
        Draw2D();
      }
    }
    ///////////////////////////////////////////////////////////
    //Fill
    if (1 == iSelect) {
    //  if (clickCount == 1) {
        spoint = e.getPoint();
        Fill();
     // }
    }
    ///////////////////////////////////////////////////////////////
    //plygon
    if (2 == iSelect) {
      if (vp.size()>0) {
        p0 = (Point) (vp.lastElement());
      }
      else {
        p0 = e.getPoint();
        lWidth = Integer.parseInt(frame.jTextFieldLWidth.getText());
        lStyle = frame.jComboBoxL.getSelectedIndex();
      }

      DrawPloygon(e.getPoint(), p0);
      vp.add(new Point(e.getPoint()));
    }
    /////////////////////////////////////////////////////////////////////////
    if (3 == iSelect) {
      if (clickCount == 1) {
        spoint = e.getPoint();
      }
      if (clickCount == 2) {
        epoint = e.getPoint();
        LineWidowClip(spoint,epoint) ;
      }

    }
    /////////////////////////////////////////////////////////////////////////
    if (4 == iSelect) {
      if (clickCount == 1) {
        spoint = e.getPoint();
      }
      if (clickCount == 2) {
        epoint = e.getPoint();
        PolygonWidowClip(spoint,epoint) ;
      }

    }

  }
////////////////////////////////////////////////////////////////////////////////
  void LineWidowClip(Point sp,Point ep)  {
    LineDx l0 = (LineDx)(v2D.lastElement());

    big.drawRect(spoint.x,spoint.y,Math.abs(epoint.x -spoint.x),
                 Math.abs(epoint.y-spoint.y));
    //repaint();

    if (0==iClipMethod){
      Object2D.CS_LineClip(l0.spoint, l0.epoint, sp, ep, BkColor, big);
    }
    if (1==iClipMethod){
      Object2D.Mid_LineClip(l0.spoint, l0.epoint, sp, ep,BkColor, big);
    }

    repaint();
  }
///////////////////////////////////////////////////////////////////////////////
  void PolygonWidowClip(Point sp,Point ep)  {
    PolygonDx tmp = (PolygonDx)(v2D.lastElement());
    big.clearRect(0, 0, Object2D.cWidth, Object2D.cHeight);
    tmp.draw(big);
    tmp.ForeColor = FrColor;
    big.setColor(Color.RED);
    big.drawRect(spoint.x,spoint.y,Math.abs(epoint.x -spoint.x),
                 Math.abs(epoint.y-spoint.y));

    tmp.SHClip(iClipMethod,spoint,epoint,this);
    repaint();
  }

////////////////////////////////////////////////////////////////////////////////
  void DrawPloygon(Point sp,Point ep)  {
    //0=虚 1=实 2=点
     //Line
     LineDx l= new LineDx(sp, ep, 1, FrColor, lWidth,lStyle);
     l.draw(big);
     repaint();

  }
///////////////////////////////////////////////////////////////////////////////
  void Fill() {
    switch (iFillMethod) {
      case 0: {
        try {
          Object2D.FloodFill4(spoint.x, spoint.y, FrColor, BkColor, bi, big);
        }
        finally {
          clickCount = 0;
        }

        break;
      }
      case 1: {
        try {
          Object2D.FloodFill8(spoint.x, spoint.y, FrColor, BkColor, bi, big);
        }
        finally {
          clickCount = 0;
        }
        break;
      }
      case 2: {
        try {
          int ic;
          ic = bi.getRGB(spoint.x,spoint.y);
          Object2D.ScanLineFill4(spoint.x, spoint.y, ic, BkColor, bi, big);
       }
        finally {
          clickCount = 0;
        }
        break;
      }
       case 3: {
          try {
            ((PolygonDx)v2D.lastElement()).polyfill(BkColor, big);
          }
          finally {
            clickCount = 0;
          }
          break;
      }
    }

    repaint();
  }

/////////////////////////////////////////////////////////////////////////////
  void DrawGrid() {
    big.setColor(Color.black);
    int j = Object2D.DemoWidth * 2;
    for (int i = 0; i < Object2D.cWidth; i = i + j) {
      big.drawLine(i, 0, i, Object2D.cHeight);
    }
    for (int i = 0; i < Object2D.cHeight; i = i + j) {
      big.drawLine(0, i, Object2D.cWidth, i);
    }
    repaint();
  }

/////////////////////////////////////////////////////////////////////////////
  void Draw2D() {
    lWidth = Integer.parseInt(frame.jTextFieldLWidth.getText());
    lStyle = frame.jComboBoxL.getSelectedIndex();
    //0=虚 1=实 2=点

    switch (iObject) {
      case 0: {
        //Line
        v2D.addElement(new LineDx(spoint, epoint, iLine, FrColor, lWidth,
                                  lStyle));
        break;
      }
      case 1: {
        //Circle
        double tmp = (epoint.x - spoint.x) * (epoint.x - spoint.x) +
            (epoint.y - spoint.y) * (epoint.y - spoint.y);
        tmp = Math.sqrt(tmp);

        v2D.addElement(new CircleDx(spoint, 0, (int) tmp, (int) tmp, FrColor,
                                    BkColor,
                                    lWidth, lStyle, frame.jRBtnFill.isSelected()));
        break;
      }
      case 2: {
        //Ellipse
        v2D.addElement(new CircleDx(spoint, 1, Math.abs(epoint.x - spoint.x),
                                    Math.abs(epoint.y - spoint.y), FrColor,
                                    BkColor,
                                    lWidth, lStyle, frame.jRBtnFill.isSelected()));
        break;
      }
    }
    clickCount = 0;
    ( (Object2D) v2D.lastElement()).draw(big);

    if (frame.jCheckBoxMenuItemDemo.isSelected()) {
      ( (Object2D) v2D.lastElement()).drawDemo(big);
    }

    repaint();

  }
///////////////////////////////////////////////////////////////////////////////
  void  Translate(int x, int y) {
    ( (Object2D) v2D.lastElement()).translate(x,y);
    ( (Object2D) v2D.lastElement()).draw(big);
    repaint();
  }
///////////////////////////////////////////////////////////////////////////////
  void Scale(double sx, double sy) {
    ( (Object2D) v2D.lastElement()).scale(sx,sy);
    ( (Object2D) v2D.lastElement()).draw(big);
    repaint();
  }
////////////////////////////////////////////////////////////////////////////////
  void Rotate(double theta, int x, int y){
    ((Object2D) v2D.lastElement()).rotate(theta,x,y);
    ((Object2D) v2D.lastElement()).draw(big);
    repaint();

  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -