您的位置:首页 > 其它

圆弧方向判断方法和三点确定一个圆的计算方法

2017-08-18 23:19 471 查看
圆弧方向判断方法

设p1=(x1,y1) 

 p2=(x2,y2)

 p3=(x3,y3)  
求向量  

   p12=(x2-x1,y2-y1)
   

   p23=(x3-x2,y3-y2)
  
则当 p12与p23的叉乘(向量积)
 

   p12 x
  p23  =   (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2)
 
   
  为正时,p1-p2-p3   路径的走向为逆时针,
 
  为负时,p1-p2-p3   走向为顺时针,
 
  为零时,p1-p2-p3   所走的方向不变,亦即三点在一直线上。

可以应用在判断三点确定圆弧,圆弧是逆时针画,还是顺势针画。

求三点的夹角
利用向量的知识

 A(a,b),B(c,d)是向量

 cosA(A,B)=(A*B)/(|A|*|B|)= (a*c+b*d)/(sqrt(a*a+b*b)*sqrt(c*c+d*d))

 A=acos(cosA)/M_PI*180

 M_PI在math.h头文件中注释掉了。#define M_PI       3.14159265358979323846

   

 注意点在计算中误差值比如cosA = 0.999999998 不是1 在A=acos(cosA)/M_PI*180得到的值是近0的1.2e-6
但是不是0。



SetArcDirection

 VB声明
Declare Function SetArcDirection Lib "gdi32" Alias "SetArcDirection" (ByVal hdc As Long, ByVal ArcDirection As Long) As Long
说明
设置圆弧的描绘方向
返回值
Long,如执行成功,返回原始的圆弧方向;零意味着出错
参数表
参数类型及说明
hdcLong,要设置的设备场景
ArcDirectionLong,AD_CLOCKWISE (顺时针)或 AD_COUNTERCLOCKWISE (逆时针)
注解
可应用于下列函数:Arc, arcto, chord, Ellipse, pie, Rectangle 和 RoundRect


Windows 默认是顺时针方向?


三点确定一个圆的计算方法

最近在写的一个软件需要根据三个坐标点来计算一个圆。因此花了点时间推导了相关的公式。这个推导不算太难,放在这里主要是做个备忘。

我们设一个圆的圆心坐标为 (x0,y),半径为r。那么这个圆的方程可以写为:

(x−x0)2+(y−y0)2=r2
在这个圆上随便取三个点,设这三个点的坐标分别是 (x1,y1),(x2,y2),(x3,y3)。那么有:

⎧⎩⎨⎪⎪(x1−x0)2+(y1−y0)2=r2(x2−x0)2+(y2−y0)2=r2(x3−x0)2+(y3−y0)2=r2(1)(2)(3)
公式(1)(2)相减,(1)(3)相减之后经过化简可以得到:

(x1−x2)x0+(y1−y2)y0=(x21−x22)−(y22−y21)2(x1−x3)x0+(y1−y3)y0=(x21−x23)−(y23−y21)2
x0,y0有唯一解的条件是系数行列式不为0:

∣∣∣(x1−x2)(x1−x3)(y1−y2)(y1−y3)∣∣∣≠0
简单变变型也就是:

x1−x2y1−y2≠x1−x3y1−y3
这样写几何含义就很明显了,三点不能共线。

设:

a=x1−x2b=y1−y2c=x1−x3d=y1−y3e=(x21−x22)−(y22−y21)2f=(x21−x23)−(y23−y21)2
那么 :

x0=−de−bfbc−ady0=−af−cebc−ad
有了 x0
和 y0
的值后,带入(1) 式就可以得到 r的值。至此,三点确定圆的问题就解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  三点 圆弧 圆弧方向
相关文章推荐