CAD坐标转换
项目场景:
今天工作中遇到一个比较棘手的问题,客户给的CAD图纸有自己的坐标格网,而且实际的数据也是按照格网的坐标进行采集的,但是呢,我在构建模型的时候是用CAD的坐标进行构建的,这就导致数据不能正确放置到对应位置上
客户坐标格网(坐标系)
CAD坐标
可以看出,俩者之间的差别还是挺大的,而且最致命的就是客户的坐标格网是倾斜的,而我们建模的CAD坐标是垂直的,所以这里就涉及到俩个坐标的对应关系,如何才能把俩个坐标上的点对应起来,如何才能把客户数据的坐标转换成我CAD的坐标
解决过程:
第一步:计算客户坐标系原点(0,0)对应CAD坐标系中的坐标
首先在图上找到一点,同时获取到他在客户坐标系和CAD坐标系下的坐标
一组对应点
对应点位置
坐标关系推演图如下所示:
由上图可以知道:
x0 = cadx - kxcosα +kysinα
y0 = cady - kxsinα - kycosα
带入之前获取的(cadx,cady)=>(37484241.92, 4426712.53) (kx,ky)=>16000,20500),我们就可以得到客户坐标系统原点(0,0)对应的CAD坐标是多少
获取客户坐标系统原点(0,0)对应的CAD坐标代码如下
//cad的x坐标
double cadx = 0;
//cad的y坐标
double cady = 0;
//矿上的本地的x坐标
double kuangx = 0;
//矿上的本地的y坐标
double kuangy = 0;
//转换后的矿上坐标的坐标原点对应的cad中的x
double x0 = 0;
//转换后的矿上坐标的坐标原点对应的cad中的y
double y0 = 0;
//矿上坐标与cad坐标在x方向上的夹角
double angle1 = 0;
if (programName.Contains("唐家会"))
{
angle1 = 25 * Math.PI / 180;
cadx = 37484241.92;
cady = 4426712.53;
kuangx = 16000;
kuangy = 20500;
//计算坐标原点
double mx1 = cadx - kuangx * Math.Cos(angle1);
double my1 = cady - kuangx * Math.Sin(angle1);
x0 = mx1 + kuangy * Math.Sin(angle1);
y0 = my1 - kuangy * Math.Cos(angle1);
}
第二步:通过计算出的坐标原点《客户坐标系原点(0,0)对应CAD坐标系中的坐标》(x0,y0),计算每一个数据在CAD坐标系下的坐标
坐标关系推演图如下所示:
由上图可知:
x = x0 + kxcosα - kysinα
y = y0 + kxsinα +kycosα
带入之前算出的(x0,y0)《客户坐标系原点(0,0)对应CAD坐标系中的坐标》,和当前客户数据的坐标(kx,ky),可以得出每一个点对应的CAD坐标
处理每一个点数据代码如下
double mx = double.Parse(x);
double my = double.Parse(y);
if(x0 != 0 && y0 != 0 && angle1 != 0 && mx != 0 && my != 0)
{
//通过原点计算换算后的坐标
double mx2 = x0 + mx * Math.Cos(angle1);
double my2 = y0 + mx * Math.Sin(angle1);
double rx = mx2 - my * Math.Sin(angle1);
double ry = my2 + my * Math.Cos(angle1);
x = rx.ToString();
y = ry.ToString();
}