Java+AutoCAD-坐标系转换

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]<</span>x)maxPoint[0]=x;

    }

    

    public void calcMaxy(double y){

       if(maxPoint[1]<</span>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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值