我狂想一下啊
在一条弧上取一个点A,找临弧上点B
只要这个AB距离是最短的,这个AB直线必过圆心
找两条这个的线,交点,就是圆心
有了圆心,与弧上随便哪个点的距离都是半径
在一条弧上取一个点A,找临弧上点B
只要这个AB距离是最短的,这个AB直线必过圆心
找两条这个的线,交点,就是圆心
有了圆心,与弧上随便哪个点的距离都是半径
解决方案 »
- 单文档建按钮及其响应函数
- 国产AC++编译器已发布1.0正式版,实现了虚拟继承,提供了更为完善的STL模板库
- ===关于SPI的基础服务提供者问题===
- 看CWnd的时候看到void CreateCaret( CBitmap* pBitmap );有点不理解~~
- 小弟急需帮助,各位大侠帮忙帮忙,帮我分析一下可能出现的错误!高分回报!在线等!
- CListCtrl控件排序,急!!!!
- 如何在Dll中发送消息,并且如何接收?
- 调试错误
- 请问如何在VC中取得传入的参数?
- 图像处理Trackbar滑动条改为固定值
- 基于UDP的局域网监控系统中不能进入WSAAsyncSelect中的自定义消息的响应函数
- 菜鸟提问 wizard生成的框架程序中菜单的消息响应在哪里?
快一点的办法,可以从上下两端搜索边界,用边界点拟合圆。有了圆心就好弄了。
void TSL_Com_LeastSquaresFitting(CList<CPoint, CPoint &> & ltPt,MyCirStu &cir)
{
if (ltPt.GetCount()<3)
{
return;
}
int i=0;
double X1=0;
double Y1=0;
double X2=0;
double Y2=0;
double X3=0;
double Y3=0;
double X1Y1=0;
double X1Y2=0;
double X2Y1=0;
POSITION pos=ltPt.GetHeadPosition();
CPoint temppt;
for (i=0;i<ltPt.GetCount();i++)
{
temppt = ltPt.GetNext(pos);
X1 = X1 + temppt.x;
Y1 = Y1 + temppt.y;
X2 = X2 + temppt.x*temppt.x;
Y2 = Y2 + temppt.y*temppt.y;
X3 = X3 + temppt.x*temppt.x*temppt.x;
Y3 = Y3 + temppt.y*temppt.y*temppt.y;
X1Y1 = X1Y1 + temppt.x*temppt.y;
X1Y2 = X1Y2 + temppt.x*temppt.y*temppt.y;
X2Y1 = X2Y1 + temppt.x*temppt.x*temppt.y;
}
double C,D,E,G,H,N;
double a,b,c;
N = ltPt.GetCount();
C = N*X2 - X1*X1;
D = N*X1Y1 - X1*Y1;
E = N*X3 + N*X1Y2 - (X2+Y2)*X1;
G = N*Y2 - Y1*Y1;
H = N*X2Y1 + N*Y3 - (X2+Y2)*Y1;
a = (H*D-E*G)/(C*G-D*D);
b = (H*C-E*D)/(D*D-G*C);
c = -(a*X1 + b*Y1 + X2 + Y2)/N;
double A,B,R;
A = a/(-2);
B = b/(-2);
R = sqrt(a*a+b*b-4*c)/2;
cir.CirCenter.x = int(A+0.5);
cir.CirCenter.y = int(B+0.5);
cir.iRadius = int(R+0.5);
return;
}
谢谢