//从圆弧一些信息得到圆弧上一个特殊的点(计算的是二维图形的情况)Point3d DBOPERATION::GetArcTangencyPoint(Point3d pStartPoint, Point3d pEndPoint,

Point3d pCenterPoint,doubledRadius,doubledStartAngle,doubledSweepAngle)

{

Point3d pResultPoint;

pResultPoint.X=0;

pResultPoint.Y=0;

pResultPoint.Z=0;//因为会得到两个点,哪个点在弧上需要再进行判断doubledRx1=0;doubledRx2=0;doubledRy1=0;doubledRy2=0;constdoublePI=3.1415926535897932;

Point3d pMiddlePoint;

pMiddlePoint.X=(pStartPoint.X+pEndPoint.X)/2;

pMiddlePoint.Y=(pStartPoint.Y+pEndPoint.Y)/2;

pMiddlePoint.Z=0.0;//扫角的角度值doubledArcSweepAngle=180*dSweepAngle/PI;//中点到圆心的距离doubleddy=0;doubleddx=0;if(pMiddlePoint.X-pCenterPoint.X>=0.1e-6)

{

ddx=pMiddlePoint.X-pCenterPoint.X;

}if(pMiddlePoint.Y-pCenterPoint.Y>=0.1e-6)

{

ddx=pMiddlePoint.Y-pCenterPoint.Y;

}doubledDistance=sqrt(ddx*ddx+ddy*ddy);if((fabs(pMiddlePoint.Y-pCenterPoint.Y)<0.1e-6&&fabs(pMiddlePoint.X-pCenterPoint.X)<0.1e-6)&&(fabs(pStartPoint.X-pEndPoint.X)<0.1e-6||fabs(pStartPoint.Y-pEndPoint.Y)<0.1e-6))

{//半圆且斜率=0或者斜率为无穷大的情况if(fabs(pStartPoint.X-pEndPoint.X)<0.1e-6)

{//结果的两个X的值dRx1=pMiddlePoint.X+(dRadius-dDistance);

dRx2=pMiddlePoint.X-(dRadius+dDistance);//对应的两个Y的值dRy1=pMiddlePoint.Y;

dRy2=pMiddlePoint.Y;

}if(fabs(pStartPoint.Y-pEndPoint.Y)<0.1e-6)

{//结果的两个X的值dRx1=pMiddlePoint.X;

dRx2=pMiddlePoint.X;//对应的两个Y的值dRy1=pMiddlePoint.Y+(dRadius-dDistance);

dRy2=pMiddlePoint.Y-(dRadius+dDistance);

}

}elseif(fabs(pMiddlePoint.Y-pCenterPoint.Y)<0.1e-6&&fabs(pMiddlePoint.X-pCenterPoint.X)>=0.1e-6)

{//圆心与端点中心点在水平线上的情况,斜率=0//结果的两个X的值dRx1=pMiddlePoint.X+(dRadius-dDistance);

dRx2=pMiddlePoint.X-(dRadius+dDistance);//对应的两个Y的值dRy1=pMiddlePoint.Y;

dRy2=pMiddlePoint.Y;

}elseif(fabs(pMiddlePoint.X-pCenterPoint.X)<0.1e-6&&fabs(pMiddlePoint.Y-pCenterPoint.Y)>=0.1e-6)

{//圆心与端点中心点在垂直线上的情况,斜率=无穷大//结果的两个X的值dRx1=pMiddlePoint.X;

dRx2=pMiddlePoint.X;//对应的两个Y的值dRy1=pMiddlePoint.Y+(dRadius-dDistance);

dRy2=pMiddlePoint.Y-(dRadius+dDistance);

}else{//圆弧两个端点成线的斜率,已经排除了等于0或者无穷大的可能性doubledTheKSAE=(pEndPoint.Y-pStartPoint.Y)/(pEndPoint.X-pStartPoint.X);//与端点组成的线垂直的线的斜率(0度,180度,360度弧的dk需要特殊处理)doubledK=(1/dTheKSAE)*(-1);if(fabs(fabs(dArcSweepAngle)-360)<0.1e-6)

{

dK=(pMiddlePoint.Y-pCenterPoint.Y)/(pMiddlePoint.X-pCenterPoint.X);

}if(fabs(fabs(dArcSweepAngle)-180)<0.1e-6)

{

dK=(pStartPoint.Y-pCenterPoint.Y)/(pStartPoint.X-pCenterPoint.X);

dK=(1/dK)*(-1);

}if(fabs(fabs(dArcSweepAngle)-0)<0.1e-6)

{

dK=(pMiddlePoint.Y-pCenterPoint.Y)/(pMiddlePoint.X-pCenterPoint.X);

}///这是经过两端点中点并与两端点组成的直线垂直的直线的方程//k为斜率,M(x),M(y)分别为中心点坐标值//y=k * x - k * M(x) + M(y)///求出- k * M(x) + M(y)部分的值doubledDif=(-1)*dK*pMiddlePoint.X+pMiddlePoint.Y;///[x - C(x)]^2 + [y - C(y)]^2 = r^2//代入上面的y,其中- k * M(x) + M(y)以dDif代替//[x - C(x)]^2 + [kx + dDif - C(y)]^2 = r^2//下面以dBetween代替+ dDif - C(y)/doubledBetween=dDif-pCenterPoint.Y;///x^2 + 2*C(x)*x + [C(x)]^2//+//(kx)^2 + 2*k*dBetween*x + (dBetween)^2//= r^2///再求中间值doubledNx=(2*dK*dBetween-2*pCenterPoint.X)/(1+dK*dK);doubledLa=(dRadius*dRadius-pCenterPoint.X*pCenterPoint.X-dBetween*dBetween)/(1+dK*dK);doubledAd=dLa+dNx*dNx/4;//结果的两个X的值dRx1=sqrt(dAd)-dNx/2;

dRx2=(-1)*sqrt(dAd)-dNx/2;//对应的两个Y的值dRy1=dK*dRx1-dK*pMiddlePoint.X+pMiddlePoint.Y;

dRy2=dK*dRx2-dK*pMiddlePoint.X+pMiddlePoint.Y;

}//对得到的两个点进行判断,找到在弧上的那个pResultPoint.X=dRx1;

pResultPoint.Y=dRy1;if(fabs(fabs(dArcSweepAngle)-180.0)<0.1e-4)

{//半圆情况处理doublep1x,p1y,p2x,p2y,qx,qy,dx1,dy1,dx2,dy2,det;

p2x=pStartPoint.X;

p2y=pStartPoint.Y;

p1x=pCenterPoint.X;

p1y=pCenterPoint.Y;

qx=dRx2;

qy=dRy2;

dx1=p2x-p1x;

dy1=p2y-p1y;

dx2=qx-p2x;

dy2=qy-p2y;

det=dx1*dy2-dx2*dy1;

BOOL bBlockWise=TRUE;if(det>0.0)

{//逆时针方向bBlockWise=FALSE;

}if(((!bBlockWise)&&(dArcSweepAngle>0.0))||((bBlockWise)&&(dArcSweepAngle<0.0)))

{

pResultPoint.X=dRx2;

pResultPoint.Y=dRy2;

}

}else{//非半圆的情况doubledd1=sqrt(pow(dRx1-pMiddlePoint.X,2)+pow(dRy1-pMiddlePoint.Y,2));doubledd2=sqrt(pow(dRx2-pMiddlePoint.X,2)+pow(dRy2-pMiddlePoint.Y,2));if(((dd1180.0))||((dd1>dd2)&&(fabs(dArcSweepAngle)<180.0)))

{

pResultPoint.X=dRx2;

pResultPoint.Y=dRy2;

}

}returnpResultPoint;

}

posted on 2010-09-08 10:12 老马驿站 阅读(338) 评论(0)  编辑 收藏 引用 所属分类: c++

c++ 圆上任意点坐标计算_已知圆弧的一些信息,求得圆弧上中间点的坐标的方法(C++语言描述)...相关推荐

  1. c++ 圆上任意点坐标计算_已知圆上任意三点坐标如何编程来计算这个圆的圆心和半径...

    在过去的一周时间里一直在计算师兄交代的任务 ,啥都没学,就一直在干这活.其中呢,我想的一个算法中就用到了本文中的这个小知识(主要就是线性代数和高中的一些知识结合起来).师兄说做的这个东西的内容要保密, ...

  2. python坐标表示_已知经纬度坐标求两点间距离,用python表示

    已知经纬度坐标求两点间距离,用python表示 已知地球上任意两点(lon1, lat1),( lon2, lat2)的经纬度坐标,求两点间的距离用haversine表示: 1.首先先将经纬度坐标的角 ...

  3. php五角星十个点坐标,请教:已知五角星的外接圆半径,如何求五角星十个顶点的坐标?(有图? 爱问知识人...

    郭敦顒回答: 设五角星的外接圆圆心为O,半径r=10(单位长),上顶点为A(0,10),⊙O(外圆)上的其它4点按逆时针方向依次为:B.C.D.E:内圆下顶点为F,其它4点依次为G.H.I.J,连OA ...

  4. freesurfer分割后的解剖文件.annot, 如何求解剖区域的三维坐标?如已知lh.HCP-MMP1.annot,如何求Glasser360的皮层三维坐标?

    我们经常会遇到需要可视化网络,这就需要求感兴趣区域的三维空间的坐标,那到底怎么求呢?下面给出详细的代码? % Function to extract centroids of a cortical p ...

  5. 已知两点坐标拾取怎么操作_已知的操作员学习-第4部分

    已知两点坐标拾取怎么操作 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's ...

  6. 已知经纬高求其在无人机图像中的像素点坐标

    背景:已知无人机拍摄时刻的经纬高(WGS84坐标系)以及物点的经纬高,求解该物点在图像中的像素点位置 三种像空间坐标系定义: ①德国汉诺威大学(Hannover)定义的像平面坐标系BLUH:原点位于像 ...

  7. python键盘输入字符串以空格为分隔符_已知str1=“ You need Python” , 以空格为分隔符,分割此此字符串,然后用“ @” 为连接符,将其连接起来()。_学小易找答案...

    [单选题]增加同步总线带宽的手段有很多,但以下( )不能提高总线带宽 [填空题]已知str1=" You need Python" , 获得字符串的字符总数(). [单选题]-40 ...

  8. matlab测量正六边形边长,计算边长已知的正六边形面积的方法

    如何计算计算边长已知的正六边形面积呢?下面让我们一起来看看吧! 计算边长已知的正六边形面积 1.如果边长已知可以直接写出求解面积的公式.由于正六边形是由六个等边三角形组成的求解公式可以从等边三角形面积 ...

  9. 已知旋转中心和旋转角度,获得旋转之后的一组点坐标

    #define PI 3.1415926535897932384626433832795 //已知旋转中心和旋转角度,获得旋转之后的一组点坐标 bool rotPoint(CPoint center, ...

最新文章

  1. JVM资源分析工具jprofiler使用简介
  2. JBoss was unable to start within 50 seconds-JBoss启动超时
  3. springboot打包时加入本地jar打包
  4. python 练习题-去重排序与字符串分割
  5. SAP UI5和CRM WebUI的View和Controller是如何绑定的
  6. HTML 页面自动刷新
  7. CentOS安装cheat和tldr
  8. 自动搜索数据增强方法分享——fast-autoaugment
  9. c++ stl 容器 迭代器 stl用法示例
  10. docker 基础操作
  11. varnish使用汇总
  12. redis 缓存模式
  13. 数百GitHub私有代码库被黑客清空:不交赎金就公开源码!
  14. 符号---Alt+数字键
  15. 慕课静态页面制作周记
  16. AutoCAD2018_编辑工具
  17. linux 脚本实现物理备份,shell脚本实现系统监视统计与数据备份
  18. css -- 为什么:last-child 无效?
  19. 一碗酸爽面-倒在黎明前
  20. 家装灯线走线图_家装灯线怎么布线

热门文章

  1. IOS工作笔记001---windows下安装通过VmWare来安装IOS系统_并连接上网_来吧超级详细
  2. 扒一扒那些奇葩的甲方吧
  3. C与C++编译的区别 C和C++混合编译
  4. web开发 开发一个能发送邮件的应用
  5. 码云、coding拉取项目代码
  6. MFC中从一个类向其他类发送消息的方法
  7. mysql中外键总结_mysql外键的一些总结
  8. python 通讯录系统_Python下的通讯录
  9. python除法运算定律_除法竖式算法的原理是什么?
  10. formdata上传文件_封装一个多文件断点续传、分片上传、秒传、重试机制的组件...