该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package 流光;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class L extends JFrame
{
static JButton bnt1 = new JButton("重置");
static JButton bnt2 = new JButton("连线");
static JPanel pan = new MyPanel();
static JPanel pan1 = new MyPanel1();
static L frm = new L();
static int i=0,j=0,z=0;
static int[][] a = new int[1000][2];
public static void main(String[] args) {
frm.setVisible(true);
frm.setTitle("算法作业");
frm.setBounds(250, 250, 700, 580);
pan.setBounds(0, 0, 700, 500);
pan.setBackground(Color.WHITE);
frm.add(pan);
pan1.setBackground(Color.green);
pan1.setBounds(0, 500, 700, 500);
frm.add(pan1);
pan.addMouseMotionListener(new MyPanel());
pan.addMouseListener(new MyPanel());
frm.setLayout(null);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
static class MyPanel extends JPanel implements MouseMotionListener,MouseListener
{
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
int x1,y1;
x1=e.getX();
y1=e.getY();
a[i][j]=x1;
j++;
a[i][j]=y1;
j--;
i++;
z++;
Graphics g=pan.getGraphics();
g.setColor(Color.red);
g.fillOval(x1,y1,8,8);
System.out.println("我是z"+z);
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
}
static class MyPanel1 extends JPanel implements ActionListener
{
MyPanel1()
{
this.add(bnt1);
bnt1.addActionListener(this);
this.add(bnt2);
bnt2.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
JButton bt = (JButton)e.getSource();
if(bt == bnt2)
{
dianxu(a,z);
Kuaibao(a,0,z-1);
Kuaibao(a,z-1,0);
}
if(bt == bnt1)
{
}
}
}
static int [][]DingDian=new int[200][2];//用于存放凸边形的顶点
static int DingDnum=0; //记录存入定点数量
static int [][]BDD=new int[200][4];//存放凸边形边的双点
static int BDDnum=0;//记录已经存入的双点数
static int abc=0;//全局变量,用来记录划边顺序
static void dianxu(int a[][],int n) //对已经输入的点数组进行排序
{//存放点的数组P[], 点的个数n
int tema,temp2,i,j,min,px,pxnum;
for(i=0;i<=n-2;i++) //按x坐标排序
{
min=i;
for(j=i+1;j<=n-1;j++)
if(a[j][0]
min=j;
tema=a[i][0];temp2=a[i][1];
a[i][0]=a[min][0]; a[i][1]=a[min][1];
a[min][0]=tema; a[min][1]= temp2;
}
//数组两端相同x按|y|排序
px=a[0][0]; pxnum=1; //前端排序
while(a[pxnum][0]==px)
pxnum++;
for(i=0;i<=pxnum-2;i++)
{
min=i;
for(j=i+1;j<=pxnum-1;j++)
if( a[j][1] < a[min][1] )
min=j;
tema=a[i][0];temp2=a[i][1];
a[i][0]=a[min][0]; a[i][1]=a[min][1];
a[min][0]=tema; a[min][1]= temp2;
}
px=a[n-1][0]; pxnum=1; //后端排序
while(a[n-1-pxnum][0]==px)
pxnum++;
for(i=n-pxnum;i<=n-2;i++)
{
min=i;
for(j=i+1;j<=n-1;j++)
if( a[j][1] < a[min][1] )
min=j;
tema=a[i][0];temp2=a[i][1];
a[i][0]=a[min][0]; a[i][1]=a[min][1];
a[min][0]=tema; a[min][1]= temp2;
}
}
static void Kuaibao(int P2[][],int l,int r)
{//P[]:存放点的数组,l,r数组中点起始与终止坐标Rtmin,Ltmax用来存放最大最小的t值
int t,Ltmax=0,Lnum=0,LL=0,i,imax;
//连接p[l],p[r]
i=(l
imax=(l>r)?l:r;
for(i=i+1;i
{
t=P2[l][0]*P2[r][1]+P2[i][0]*P2[l][1]+P2[r][0]*P2[i][1]-P2[i][0]*P2[r][1]-P2[r][0]*P2[l][1]-P2[l][0]*P2[i][1];
// 判断t正负,t>0,Lnum++;(Lnum初值为0)
if(t>Ltmax)
{
Lnum++; LL=i; Ltmax=t;
}
}
if(Lnum>0)
{
DingDian[DingDnum][0]=P2[LL][0]; DingDian[DingDnum][1]=P2[LL][1];
DingDnum++; Kuaibao(P2,l,LL);
Kuaibao(P2,LL,r);
}
else//t=0时,将P[l]、P[r]放入边集
{
BDD[BDDnum][0]=P2[l][0]; BDD[BDDnum][1]=P2[l][1];
BDD[BDDnum][2]=P2[r][0]; BDD[BDDnum][3]=P2[r][1];
Graphics g=pan.getGraphics();
g.drawLine(BDD[BDDnum][0], BDD[BDDnum][1], BDD[BDDnum][2], BDD[BDDnum][3]);
try {Thread.currentThread();
Thread.sleep(100);}catch(Exception a){}
System.out.println("我是BDDnum "+BDDnum);
BDDnum++;//记录已经存入的双点数
}
}
}