AutoCAD的坐标系是世界坐标系WCS,以左下角为原点(0,0),如[2113750.8379795915 -2810631.1969831306 0.0]。由于我要解析的文件都是平面的,因此不需要z坐标。
我要实现的效果是在html canvas上展现。以左上角为原点(0,0),并且canvas有一定宽度和高度,要在屏幕整体上展现出所有的图。
基本的思路是:
(1)以DXF文件的x、y坐标的最小和最大值为屏幕的四个角。
(2)将坐标点,以距离原点的长度为准则,按比例复制到屏幕上。
(3)横坐标都是向右,不用转换。纵坐标则不同,需要转换一下。
(4)复杂的图和简单的图,按上述的算法算出来都是满满的放在画布上,可能整体比例不太好,需要按比例伸缩一下。
(5)计算出来的坐标是紧贴边线的,效果也不是很好,因此需要转换一下。
1、坐标系的转换程序
//WCS坐标系是左下角是(0,0);;">)
public double canvasWidht=1000,canvasHeight=1000;//屏幕的宽度和高度
private double sideWidth=10,sideHeight=10;//留点边,别直接是0
private double rateX=1,rateY=1;//横向和纵向放大和缩小的比例 以原始的最大和最小坐标为基准,完全换算成屏幕的宽度和高度。支持手工设置比例
private double[] minPoint = new double[]{999999999,999999999};//最小的坐标
private double[] maxPoint = new double[]{-999999999,-999999999};//最大的坐标
public void calcMinx(double x){
if(minPoint[0]>x)minPoint[0]=x;
}
public void calcMiny(double y){
if(minPoint[1]>y)minPoint[1]=y;
}
public void calcMaxx(double x){
if(maxPoint[0]<x)maxPoint[0]=x;
}
public void calcMaxy(double y){
if(maxPoint[1]<y)maxPoint[1]=y;
}
public doublecalcPointX(double x){
double retX = (x-minPoint[0])/(maxPoint[0]-minPoint[0])*(canvasWidht-sideWidth*2)*rateX;
retX = new Double(retX).intValue()+sideWidth;
return retX;
}
public doublecalcPointY(double y){
double retY = (canvasHeight-(y-minPoint[1])/(maxPoint[1]-minPoint[1])*(canvasHeight-sideHeight*2))*rateY;
retY = new Double(retY).intValue()-sideHeight;
return retY;
}
2、计算最小和最大的坐标
这就需要在每个图元的类中单独调用。以直线图元为例,在calc(Yxxf D)中调用。
Public void calc(Yxxf D)
{
//计算最小坐标
D.calcMinx(begpnt.x);
D.calcMiny(begpnt.y);
D.calcMinx(endpnt.x);
D.calcMiny(endpnt.y);
//计算最大坐标
D.calcMaxx(begpnt.x);
D.calcMaxy(begpnt.y);
D.calcMaxx(endpnt.x);
D.calcMaxy(endpnt.y);
}
3、转换坐标
这也需要在每个图元的类中单独调用。以直线图元为例,增加calcPoint(Yxxf D)调用。
public voidcalcPoint(Yxxf D){
begPoint.x = D.calcPointX(begpnt.x);
begPoint.y = D.calcPointY(begpnt.y);
endPoint.x = D.calcPointX(endpnt.x);
endPoint.y = D.calcPointY(endpnt.y);
}
4、
以直线图元为例,转换的效果如下:
begpnt=[2113750.8379795915-2810631.1969831306 0.0]//开始节点的坐标xyz
endpnt=[2086641.0393874221-2810631.1969831306 0.0] //结束节点的坐标xyz
begPoint=[990.0 990.0 0.0] //开始节点的坐标xyz转换后
endPoint=[806.0 990.0 0.0] //结束节点的坐标xyz转换后
thickness=0.0//厚度
xtruDir=[0.0 0.0 1.0] //拉伸的坐标xyz