highflybird
发表于 2012-6-6 12:52:42
lzz0517 发表于 2012-6-6 11:50 static/image/common/back.gif
你说那个是不是用来求长轴矢量的呢,我今天看了一下没看明白怎么用!
楼主再仔细看看70楼最后一段话。
首先求出椭圆在块内的长轴端点 和椭圆中心
把这两点通过插入块的变换矩阵,映射到世界坐标系中,那么不就得到了椭圆的在世界坐标系下的长轴矢量了吗?
highflybird
发表于 2012-6-6 12:56:14
如果楼主是用线段来模拟椭圆的,那为何不求出椭圆在块内的各分点的坐标呢?然后变换到世界坐标系就是了,最后把这些点用线段连起来。
不过要问一下:为什么不用RotateTransform 等C#中的矩阵变换函数对图像进行变换呢?
lzz0517
发表于 2012-6-6 14:58:24
本帖最后由 lzz0517 于 2012-6-6 14:59 编辑
你看看我步骤有没有错,我用了你说的计算椭圆长轴矢量的方法进行计算,但与CAD上进行比较后,对不上CAD上的值:
double ix=-399474.1637001187;//插入点X
double iy=3238438.33505016; //插入点Y
double scalex=-1.0;//缩放比例X
double scaley=1.0;//缩放比例Y
double angle=106.4911716322804*Math.PI/180; //插入点旋转弧度
double ox=3217926.635124058; //块坐标系的圆心X
double oy=532617.0907392278; //块坐标系的圆心Y
double lrx=45.66621877367426; // 长轴端点X
double lry=337.0426302735758;//长轴端点Y
double ratio=0.9999999999977266;//半径比例
double sa=2.35439212168697; // 起始弧度
double ea=3.641394339275362;// 终止弧度
//计算椭圆弧的长轴矢量坐标
double x=ox+lrx;
double y=oy+lry;
double nx=ix+x*Math.Cos(angle)*scalex-y*Math.Sin(angle)*scaley;
double ny=iy+y*Math.Cos(angle)*scaley+x*Math.Sin(angle)*scalex;
//计算得到的长轴端点坐标X=2973.66024679359,Y=1553.78513403563
Console.WriteLine("长轴端点坐标X={0},Y={1}",nx,ny);
double nox=ix+ox*Math.Cos(angle)*scalex-oy*Math.Sin(angle)*scaley;
double noy=iy+oy*Math.Cos(angle)*scaley+ox*Math.Sin(angle)*scalex;
// 计算得到的圆心坐标X=3283.87495806016,Y=1693.24828713574
double Vx=nx-nox;
double Vy=ny-noy;
//这是计算得到长轴矢量坐标X=-310.21471126657,Y=-139.463153100107
//CAD上显示的圆心和长轴矢量坐标
//圆心X=3283.875,Y=1693.2483
//长轴矢量坐标X=318.3132,Y=119.8326
highflybird
发表于 2012-6-6 15:16:19
lzz0517 发表于 2012-6-6 14:58 static/image/common/back.gif
你看看我步骤有没有错,我用了你说的计算椭圆长轴矢量的方法进行计算,但与CAD上进行比较后,对不上CAD上的 ...
我已经提示:
炸开后椭圆的参数已经发生了变化。
所以不能以炸开后的图形作为参照。
lzz0517
发表于 2012-6-6 15:32:41
highflybird 发表于 2012-6-6 15:16 static/image/common/back.gif
我已经提示:
炸开后椭圆的参数已经发生了变化。
所以不能以炸开后的图形作为参照。
如果椭圆参数发生了变化,这个能详细点吗?
因为如果以我们计算的长轴矢量进行起始角度的计算和终止角度的计算的话,画出来的图形会出现位置上的不对,椭圆弧上所有的点都是通过角度进行计算的!
lzz0517
发表于 2012-6-6 15:47:46
这个图是我用那个方法计算出来的矢量,起点矢量,端点矢量分别计算出起始角度,终止角度后绘画出来的结果。
highflybird
发表于 2012-6-6 15:53:56
你可以先求出椭圆在图块内的各点坐标(从你的程序中看出分了64等分,那就是65个点),然后映射到世界坐标系中。
lzz0517
发表于 2012-6-6 16:15:02
本帖最后由 lzz0517 于 2012-6-6 16:16 编辑
这是根据你说的方法进行求解的结果,先读取DXF文件中椭圆弧的参数进行坐标的计算,然后再进行块矩阵的转换计算出世界坐标系下的坐标,如图所示
所以,我觉得还是应该考虑怎么才能求出炸开后椭圆弧在CAD上显示的长轴矢量坐标
highflybird
发表于 2012-6-6 16:19:29
本帖最后由 highflybird 于 2012-6-6 16:21 编辑
lzz0517 发表于 2012-6-6 16:15 static/image/common/back.gif
这是根据你说的方法进行求解的结果,先读取DXF文件中椭圆弧的参数进行坐标的计算,然后再进行块矩阵的转 ...
你没用我83楼讲的方法。
另外我在CAD用那个变换方法能正确创建椭圆弧。
lzz0517
发表于 2012-6-6 16:25:57
本帖最后由 lzz0517 于 2012-6-6 16:27 编辑
用了啊, 我是这样子做的,
for (int i = 0; i < 65;i++ )
{
double ang = sa + i * (ea - sa) / 64; // sa为DXF中的起始弧度,ea为DXF中的终止弧度,
//ra为椭圆弧的倾斜弧度,R为长半径,r为短半径,Insert.Point1为插入点坐标,Insert.cos 为插入点角度余弦值,Insert.sin 为插入点角度正弦值,Scale(x,y,z)为缩放比例,center为DXF中的圆心
double x = R * Math.Cos(ang) * Math.Cos(ra) - r * Math.Sin(ang) * Math.Sin(ra)+center.X;
double y = r * Math.Sin(ang) * Math.Cos(ra) + R * Math.Cos(ang) * Math.Sin(ra)+center.Y;
double xx = Insert.Point1.X + x * Insert.cos * Scale.X - y * Insert.sin * Scale.Y;
double yy = Insert.Point1.Y + y * Insert.cos * Scale.Y + x * Insert.sin * Scale.X;
points.X = (float)xx;
points.Y = (float)yy;
points.Z = center.Z;
}
页:
1
2
3
4
5
6
7
8
[9]
10
11