坐标1(x1,y1)坐标2(x2,y2)弧度:E
圆半径:R
列出方程:
(x-x1)(x-x1)+(y-y1)(y-y1)=R·R
(x-x2)(x-x2)+(y-y2)(y-y2)=R·R
4R·R·Sin(E/2)·Sin(E/2)=(x1-x2)(x1-x2)+(y1-y2)(y1-y2)
以上方程三个未知数,三个独立条件,完整的确定解方程,请自己解吧!我就不动手了,哈哈哈
圆半径:R
列出方程:
(x-x1)(x-x1)+(y-y1)(y-y1)=R·R
(x-x2)(x-x2)+(y-y2)(y-y2)=R·R
4R·R·Sin(E/2)·Sin(E/2)=(x1-x2)(x1-x2)+(y1-y2)(y1-y2)
以上方程三个未知数,三个独立条件,完整的确定解方程,请自己解吧!我就不动手了,哈哈哈
前提:两点a(x1,y1),b(x2,y2),α为对应弧角
1.先计算垂分线斜率,
k1,k2为斜率,其中k1=(y2-y1)/(x2-x1)(当然要判断x1<>x2,至于等于时就不用我说了,那简直太好做了)
k1*k2=-1
2.写出垂分线方程,并用之导出y用x表示的关系式
3.用两点间距离公式,求到即((x1+x2)/2,(y1+y2)/2)的距离
即可.
至于程序不用我说了,应该很容易实现的
dd=r^2-((x1-x2)^2+(y2-y1)^2)/4
然后dd=(x-(x1+x2)/2)^2+(y-(y1+y2)^2)
其中x,y为垂分线上一点,不难用2代入上式中,计算出X,继而算出Y
圆心肯定是在弦两端连线的中垂线上,利用直角三角形及余弦函数就可以搞定啦。
首先设弦两个端点为(x1,y1)(x2,y2),弧度为alpha
1.先把弧度转成角度以便计算角度deg:=alphi*180/PI;
2.计算两端点连线的方程,设方程形式为 Y=a1*X+b1
则 a1:=(y1-y2)/(x1-x2);
b1:=y1-a1*x1;
3.计算上一步中的线段的中垂线,这里设成参数方程比较方便
设为{X=a2*t+b2
{Y=a3*t+b3
t的含义为直线上的点到弦中点的距离
这里略过求解步骤,直接给出结果
b2:=(x1+x2)/2;
b3:=(y2+y3)/2;
temp:=sqrt(sqr(b2)+sqr(b2/a1));
a2:=(-b2)/temp;
a3:=(b2/a1)/temp;
4.计算圆心到弦的距离,设为od
temp:=sqrt(sqr(x1-x2)+sqr(y1-y2))/2;
od:=ctg(deg/2)*temp;
5.计算出圆心的坐标
ox1:=a2*od+b2;
oy1:=a3*od+b3;
ox2:=a2*(-od)+b2;
oy2:=a3*(-od)+b3;
之所以有两个(ox1,oy1)和(ox2,oy2)是因为弧的方向没有给定,这就要根据需要取舍了,自己判断哦!完整代码:
const
PI=3.14159265;
var
...
Procedure GetCircleCenter(deg : double; x1,y1,x2,y2 : double; Var ox1,oy1,ox2,oy1 : double);
var
a1,b1,a2,a3,b2,b3,temp,od:double;
begin
deg:=alphi*180/PI;
a1:=(y1-y2)/(x1-x2);
b1:=y1-a1*x1;
b2:=(x1+x2)/2;
b3:=(y2+y3)/2;
temp:=sqrt(sqr(b2)+sqr(b2/a1));
a2:=(-b2)/temp;
a3:=(b2/a1)/temp;
temp:=sqrt(sqr(x1-x2)+sqr(y1-y2))/2;
od:=ctg(deg/2)*temp;
ox1:=a2*od+b2;
oy1:=a3*od+b3;
ox2:=a2*(-od)+b2;
oy2:=a3*(-od)+b3;
end;