在java中实现图形学中的直线算法

有同学向我要在java中实现图形学中的椭圆算法,画直线的算法的程序,在此就献丑了,把上大学时用java写的源代码给先学者做个参考,下面是实现直线的算法

//author computer np
/*test date
 *(0,0)(300,15)/(-300,-300)(300,300)/(0,0)
 *(300,300)/(-200,-50)(300,150)*0<K<=1
 *
 *(0,0)(300,450)/(0,0)(300,800)(50,500)(-50,-500)*K>1
 *
 *(-50,500)(50,-500)/(-50,500)(100,-500)*K<-1
 *
 *(-200,50)(200,-100)
 *
 */
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class DrawLine
{
 public static void main(String[] args)
 {
  new MainFrame();
 }
}
class MainFrame extends JFrame implements ActionListener
{
 JPanel pane=new JPanel();
 //JLabel zuobiao;
 JTextField T_x0,T_y0,T_x1,T_y1;
 JButton Draw,Show;
 JLabel L_x0,L_y0,L_x1,L_y1;
 int x0,y0,x1,y1;
 MainFrame()
 {
  super("DrawLine Window");
  Container con=this.getContentPane();
  con.setLayout(null);
  
  pane.setBounds(20,20,850,550);
  pane.setBackground(new Color(100,156,200));
  con.add(pane);
  
  L_x0=new JLabel("X0");
  L_x0.setBounds(230,580,30,20);
  con.add(L_x0);
  
  L_x1=new JLabel("X1");
  L_x1.setBounds(370,580,30,20);
  con.add(L_x1);
  
  L_y0=new JLabel("Y0");
  L_y0.setBounds(230,630,30,20);
  con.add(L_y0);
  
  L_y1=new JLabel("Y1");
  L_y1.setBounds(370,630,30,20);
  con.add(L_y1);
  
  T_x0=new JTextField();
  T_x0.setBounds(270,580,50,20);
  con.add(T_x0);
  
  T_y0=new JTextField();
  T_y0.setBounds(270,630,50,20);
  con.add(T_y0);
  
  T_x1=new JTextField();
  T_x1.setBounds(400,580,50,20);
  con.add(T_x1);
  
  T_y1=new JTextField();
  T_y1.setBounds(400,630,50,20);
  con.add(T_y1);
  
  Draw=new JButton("画 线");
  Draw.setBounds(550,580,90,30);
  Draw.addActionListener(this);
  con.add(Draw);
  
  Show=new JButton("显示坐标");
  Show.setBounds(550,620,90,30);
  Show.addActionListener(this);
  con.add(Show);
  
  this.addWindowListener(new CloseWindow());
  this.setBounds(20,20,900,700);
  this.setVisible(true);
  this.setResizable(false);
  
 }
 
 public void actionPerformed(ActionEvent e)
 {
     if(e.getSource()==Draw)
     {
      x0=Integer.parseInt(T_x0.getText().trim());
      y0=Integer.parseInt(T_y0.getText().trim());
      x1=Integer.parseInt(T_x1.getText().trim());
      y1=Integer.parseInt(T_y1.getText().trim());
  
       float K=(float)(y1-y0)/(x1-x0);

       Line line=new Line(this);
       if(K>=0&&K<=1)
         line.draw0(x0,y0,x1,y1);
       else if(K>1)
         line.draw1(x0,y0,x1,y1);
       else if(K<=0&&K>=-1)
         line.draw2(x0,y0,x1,y1);
        else if(K<-1)
        line.draw3(x0,y0,x1,y1);
     }
     if(e.getSource()==Show)
     {
       Graphics g1=this.pane.getGraphics();
          g1.setColor(Color.PINK);
          g1.drawLine(0,300,920,300);//----x---
          g1.drawLine(410,0,410,720);//----y---
          g1.dispose();
     }
  
 }/*method actionPerformed*/
}
class Line
{
 MainFrame jb;
 Line(MainFrame jb)
 {
  this.jb=jb;
 }
 //*************0<K<1*********************************
 public void draw0(int x0,int y0,int x1,int y1)//0<K<1
 {
  int dx,dy,d,UpIncre,DownIncre,x,y;
     if(x0>x1)
       {
      x=x1;x1=x0;x0=x;
      y=y1;y1=y0;y0=y;
     }
       x=x0; y=y0;
     dx=x1-x0; dy=y1-y0;
     d=dx-2*dy;
     UpIncre=2*dx-2*dy;
     DownIncre=-2*dy;
     while(x<=x1)
        {
      try
      {
       Graphics g=jb.pane.getGraphics();
       g.setColor(Color.red);
          g.drawLine(x+410,y+300,x+412,y+302);
          g.dispose();
          Thread.sleep(30);
      }catch(Exception e){}
         x++;
         if(d<0)
      {
       y++;
       d+=UpIncre;
       }
      else
   d+=DownIncre;
     }
  
 }
 //*************0<K<1*********************************
 //----------K>1------------------------------------
 public void draw1(int x0,int y0,int x1,int y1)//K>1
 {
  int dx,dy,d,UpIncre,DownIncre,x,y;
     if(x0>x1)
     {
      x=x1;x1=x0;x0=x;
      y=y1;y1=y0;y0=y;
     }
     x=x0; y=y0;
     dx=x1-x0;
     dy=y1-y0;
        d=2*dx-dy;
     UpIncre=2*dx;
     DownIncre=2*dx-2*dy;
     while(x<=x1)
     {
      try
      {
       Graphics g=jb.pane.getGraphics();
       g.setColor(Color.red);
          g.drawLine(x+410,y+300,x+412,y+302);
          g.dispose();
          Thread.sleep(30);
      }catch(Exception e){}
      y++;
      if(d>=0)
      {
       x++;
       d+=DownIncre;
      }
      else
       d+=UpIncre;
     }
 }
 //----------K>1------------------------------------
 //***********-1<k<0*************************************
 public void draw2(int x0,int y0,int x1,int y1)//  -1<K<0
 {
  int dx,dy,d,UpIncre,DownIncre,x,y;
     if(x0>x1)
     {
      x=x1;x1=x0;x0=x;
      y=y1;y1=y0;y0=y;
     }
     x=x0; y=y0;
     dx=x1-x0;
     dy=y1-y0;
     d=-dx-2*dy;
     UpIncre=-2*dy;
     DownIncre=-2*dx-2*dy;
     while(x<=x1)
     {
      try
      {
       Graphics g=jb.pane.getGraphics();
       g.setColor(Color.red);
          g.drawLine(x+410,y+300,x+412,y+302);
          g.dispose();
          Thread.sleep(30);
      }catch(Exception e){}
      x++;
      if(d>=0)
      {
       y--;
       d+=DownIncre;

      }
      else
       d+=UpIncre;
     }
 }
 //***********-1<k<0*************************************
 //------------K>-1--------------------------------------
 public void draw3(int x0,int y0,int x1,int y1)//  K<-1
 {
  int dx,dy,d,UpIncre,DownIncre,x,y;
     if(x0>x1)
     {
      x=x1;x1=x0;x0=x;
      y=y1;y1=y0;y0=y;
     }
     x=x0; y=y0;
     dx=x1-x0;
     dy=y1-y0;
     d=-2*dx-dy;
     UpIncre=-2*dx;
     DownIncre=-2*dx-2*dy;
     while(x<=x1)
     {
      try
      {
       Graphics g=jb.pane.getGraphics();
       g.setColor(Color.red);
          g.drawLine(x+410,y+300,x+412,y+302);
          g.dispose();
          Thread.sleep(30);
      }catch(Exception e){}
      y--;
      if(d<0)
      {
       x++;
       d+=DownIncre;
      }
      else
   d+=UpIncre;
     }
 }
 //------------K>-1----------------------------------
}
class CloseWindow extends WindowAdapter
{
 public void windowClosing(WindowEvent e)
 {
  System.exit(0);
 }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Eclipse平台JAVA实现 1. 实验内容 用基本增量算法和Bresenham算法直线 2.实验目的 1)理解在显示器上画图与在纸上画图的本质区别; 2)掌握直线的光栅扫描转换过程; 3)掌握不同算法绘制直线的思路和优缺点。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。 1. 实验内容 用正负法和Bresenham算法画圆弧 2.实验目的 1)掌握圆及圆弧的光栅扫描转换过程; 2)掌握不同算法绘制圆弧的技巧和优缺点。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。 1. 实验内容 用Cohen-SutherLand算法和liang _barsky算法进行线段裁剪 2.实验目的 1)理解裁剪的相关概念 2)掌握直线段的一般裁剪过程; 3)理解并掌握Cohen-SutherLand 算法的编码思想; 4)理解并掌握Liang_Barsky算法的参数化裁剪思想; 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁线段和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来; 6)裁剪过程可以重复进行。 1. 实验内容 用Sutherland-Hodgman算法进行多边形裁剪 2.实验目的 1)理解多边形裁剪直线裁剪的区别; 2)掌握多边形的裁剪过程; 3)理解并掌握Sutherland-Hodgman算法裁剪思想。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁多边形和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)多边形被窗口的四条边裁剪的过程以及多边形顶点增删的过程要显示出来; 5)裁剪过程可以重复进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值