‘已知圆弧的两点及半径求圆心的座标’十万火急。解析几何问题

guangguang 2000-06-18 09:14:00
已知圆弧的两点(X1,Y1),(X2,Y2)及半径 R 求圆心的座标(XC,YC)’
最好请用参数式表示。
既:
1》当。。。。。。
2》XC=。。。
YC=。。。
用于转换一种CAD 文件



E-MAIN HJG8888@YEAH.NET
...全文
2264 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
trivita 2000-07-10
  • 打赏
  • 举报
回复
我的算法可能比较耗计算量下(还可优化),如下(有特殊情况,比如x1=x2):
d=(1,2)两点间的距离;
e1=arctan((y1-y2)/(x1-x2));
e2=arccos(2*r/d);
e3=e1-e2;
x3=r*cos(e3)+x2; y3=-r*sin(e3)+y2
x4=x1+x2-x3; y4=y1+y2-y3;
ad 2000-07-06
  • 打赏
  • 举报
回复
guangguang是在解读dxf文件吗,这个问题我也没有很好解决,主要是计算太复杂,暂时没精力,下面是已实现的算法,但存在错误,有些因素未考虑,你再研究一下吧,解决后别忘给我一份代码。dzm_xy@163.net

//计算pline实体的弧段,bFlag表示是直接实体还是块中的实体(块有基点、旋转、伸缩)
void CadMap::_DrawPlineArc(double x1,double y1,double x2,double y2, double r, BOOL bFlag)
{
PNT center, base, axis;
double angs, ange, rot_ang; //angs:起始角; ange终止角
double x1sub2 = x1 - x2, y1sub2 = y1 - y2;
double x1add2 = x1 + x2, y1add2 = y1 + y2;
double xyv = (x1sub2 * x1add2 + y1sub2 * y1add2) / 2.0;
if(x1sub2 == 0.0){
ASSERT(y1sub2 != 0.0);
center.y = xyv / y1sub2; //in fact is (y1+y2)/2
double ysub1 = center.y - y1;
double ry = sqrt((r + ysub1) * (center.y - ysub1));
if(r * y1sub2 > 0.0)
center.x = x1 + ry;
else
center.x = x1 - ry;
}
else{
double d = xyv / x1sub2 - x1;
double e = y1sub2 / x1sub2;
double f = e * e + 1;
double g = e * d + y1;
double h = d * d + (y1 + r) * (y1 - r);
double a = g / f;
double a2 = a * a;
double hf = h/f;
double b = (a2 < hf) ? 0.0 : sqrt(a2 - hf);
if(r * x1sub2 > 0.0)
center.y = a - b;
else
center.y = a + b;
center.x = (xyv - y1sub2 * center.y) / x1sub2;
}

angs = atan2(y1 - center.y, x1 - center.x);
ange = atan2(y2 - center.y, x2 - center.x);
if(bFlag){
center.x = (center.x-m_ip.borgx)*m_ip.xscale;
center.y = (center.y-m_ip.borgy)*m_ip.yscale;
axis.x = r*m_ip.xscale;
axis.y = r*m_ip.yscale;
base.x = m_ip.bx;
base.y = m_ip.by;
rot_ang = m_ip.rotAng;
}
else{
axis.x = r;
axis.y = r;
base.x = 0.0;
base.y = 0.0;
rot_ang = 0.0;
}
_ExtArc(¢er, &base, &axis, angs, ange, rot_ang);
}

//显示弧段
void CadMap::_ExtArc(PNT *_center,PNT *_base,PNT *_axis,double _angs,double _ange,double _rotAng)
{
double x1,y1,ranInc;//,x0,y0;
double r=(_axis->x+_axis->y)*m_dScale/2.0;
BOOL firstVert=TRUE;
double pi_360=PI/360.0;
if(r<10.0)
ranInc=pi_360*10;
else if(r<20)
ranInc=pi_360*8;
else if(r<40)
ranInc=pi_360*6;
else if(r<80)
ranInc=pi_360*4;
else if(r<160)
ranInc=pi_360*2;
else
ranInc=pi_360;

if(_angs>_ange) _ange+=2*PI;
r=_angs;
while(1){
x1=_axis->x*cos(r);
y1=_axis->y*sin(r);
x1+=_center->x;
y1+=_center->y;
_RotateCoord(&x1,&y1,_rotAng); //将x1,y1旋转_rotAng角度
x1+=_base->x;
y1+=_base->y;
MCtoDC(x1,y1); //CAD坐标转换为设备坐标,自写函数
if(firstVert){
m_pDC->MoveTo(trunc(x1),trunc(y1));
firstVert=FALSE;
//x0=x1,y0=y1;
}
else{
m_pDC->LineTo(trunc(x1),trunc(y1));
}
if(r==_ange) break;
r+=ranInc;
if(r>_ange) r=_ange;
}
}

guangguang 2000-06-20
  • 打赏
  • 举报
回复
因为我二元二次方程的解法已大部分还给高中数学老师了。正在恶补。因为时间紧迫所以请你多费心了。多谢。
guangguang 2000-06-19
  • 打赏
  • 举报
回复
Larky 你好:
原题是已知圆弧两端点(X1,Y1) (X2,Y2) 及弧高(弦的中心到弧中心的距离)与弦长一半的比 N ,求圆心坐标(XC,YC)。我前面所讲已知半径 R 已经是经过计算的了。能帮我把二元二次方程的解推导出来吗。多谢。多谢。(请问如何把这题的分数加高。现在只可以61分)而你说的第二种方法实现起来以有多种限制。且不太适合于计算机自动转换。

E-MAIN : HJG8888@yeah.net
Larky 2000-06-19
  • 打赏
  • 举报
回复
好吧我抽时间给你推一下!
不过我想不明白,为什么你自己不推呢?
zhouxx 2000-06-18
  • 打赏
  • 举报
回复
作两个以已知点为圆心,r为半径的圆,再取交点,但注意有两个交点
Larky 2000-06-18
  • 打赏
  • 举报
回复
我想最直接的办法就是解一个二元二次方程组,
只是推倒的时候要代一大堆的X1,X2...
麻烦了一点!不过一劳永逸!
要不然你也可以用旋转坐标的方法来算
你还可以先算出两点的中点,再算出中垂线的斜率,
然后换算成Sin 和 Cos,最后根据圆心到中点的距离和SinCos就可以算出坐标了

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧