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());
}
}
源代码:
/Files/panda084/LinePaint.rar