Vector我也可以做
這些年, CRH、支線客機、“神五”、“神六”的出現,驚嘆科技的強大。在這其中計算機輔助設計,計算機仿真等技術在其中起著重要的作用。
計算機輔助設計(CAD)是一項利用計算機矢量圖形技術來完成圖形繪制、修改等工作的技術。由于矢量圖形處理具有數據精度高、保真性能好、修改方便等特點,現在被廣泛應用于工程設計、工業加工、激光雕刻、激光打標等領域和行業。
現在目前的矢量圖形處理的軟件很多。如工業設計上用得比較多的AutoCAD、UG、Pro/E,平面設計、排版上用的CorelDraw、Illustrator,激光標刻行業上用的EzCAD,電子設計上用的Protel等等。它們各有其側重,是由于應用而決定的,但其中的核心處理機制是一樣。
不知你是否想在你的工作中用這一類的軟件,是否有覺得這些現有的軟件,在某些方面不適合你所處的行業。不管是否是程序員,只要你有這方面的興趣,我想和大家一起研究如何做矢量圖形處理軟件。
一、 熱身
說了這么多, 我想先熱熱身,做一個能畫線的程序。(這里我用Java做為開發語言,主要是考慮其簡單、易學,適合于初學者)
1、建一個用于存儲線數據的類
class LineData
{
private int x1, x2, y1, y2;
public int getX1() {
return x1;
}
public void setX1(int x1) {
this.x1 = x1;
}
public int getX2() {
return x2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getY1() {
return y1;
}
public void setY1(int y1) {
this.y1 = y1;
}
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
public LineData(int x1, int y1, int x2, int y2)
{
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
public LineData(LineData line)
{
this(line.x1, line.y1, line.x2, line.y2);
}
public LineData()
{
this(0,0,0,0);
}
}
2、現在可以建一個畫布用于響應鼠標點擊、移動操作用于繪圖。
1) 這里這個類繼承至JPanel類,同時為了響應鼠標操作實現MouseListener, MouseMotionListener接口:public class Canvas extends JPanel implements ICanvas, MouseListener, MouseMotionListener。在類的構造器上加入
addMouseListener(this);
addMouseMotionListener(this);
語句。
2) 在類加入三個變量,
a)用于存當前活躍的線信息的線數據:LineData active = new LineData();
b)用于存已畫好的線集數據:Vector<LineData> lines = new Vector<LineData>();
c)用于存當前畫操作狀態:boolean isDrawing = false;
3) 現在寫一個畫線集的方法:
private void drawLines()
{
for(LineData line : lines)
{
g.drawLine(line.getX1(), line.getY1(), line.getX2(), line.getY2());
}
}
4) 重載JPanel中的paintCompomont方法
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawLines(g);
if(isDrawing)
g.drawLine(active.getX1(), active.getY1(), active.getX2(), active.getY2());
}
5)現在可以實現鼠標響應:
a) 鼠標按下
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
isDrawing = !isDrawing;
if(isDrawing)
{
active.setX1(x);
active.setY1(y);
}
else
{
active.setX2(x);
active.setY2(y);
lines.add(new LineData(active));
}
}
b) 鼠標移動
@Override
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if(isDrawing)
{
active.setX2(x);
active.setY2(y);
repaint();
}
}
3、實現主窗體
public class LinePaint extends JFrame {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
LinePaint frame = new LinePaint();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public LinePaint() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(new Canvas());
}
}