圆弧方向判断方法和三点确定一个圆的计算方法
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。
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的值。至此,三点确定圆的问题就解决了。
设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的值。至此,三点确定圆的问题就解决了。
相关文章推荐
- 三点确定一个圆的计算方法
- 三点确定一个圆的计算方法
- 帮忙确定一个计算智能研究方向
- C#l练习(用方法来实现:①判断一个给定的整数是否为“质数”。②计算1-100之间的所有质数(素数)的和
- 判断一个点是否在圆内(三点确定一个圆)
- 用户输入一个日期,计算时星期几,并计算时一年中的某一天,使用自定义方法判断
- SQL计算秒数的一个简单方法
- 分享一个判断dedecms版本的方法
- C++数据结构与算法之判断一个链表是否为回文结构的方法
- C语言 判断字符是否是一个数字的两种方法
- StringUtils 工具类中判断一个string类型的值是否为空的几种方法
- 如何判断一个网页是刷新还是关闭的方法。
- 在HTML页面上点击按钮按钮携带参数flag,触发一个JS函数,经过判断是否flag==1,分别跳到两个指定的方法(或者页面)
- 一个判断页面是否被刷方法(原创)
- 判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
- 写一个递归方法,传入一个Map,返回这个Map对象中一共有多个Map类型的对象 Map中是可以添加Map,被添加的这个Map也可以添加Map,所以需要判断传入的Map对象的所有子节点,如果是Map就
- 简单的几种给定一个数判断是否是质数的方法
- Python判断一个字符串是否包含子串的几种方法
- JS判断一个数组中是否有重复值的三种方法来自
- JS 判断某变量是否为某数组中的一个值 的几种方法