1 三点决定一个圆,切不能3点一线
- (x1−x0)^2+(y1−y0)^2=r^2
- (x2−x0)^2+(y2−y0)^2=r^2
- (x3−x0)^2+(y3−y0)^2=r^2
代码块:
---@return UnityEngine.Vector3
---@return number
function FishTools.GetCircle(pt1, pt2, pt3 )
local radius
local x1,x2,x3 = pt1.x, pt2.x, pt3.x
local y1,y2,y3 = pt1.y, pt2.y, pt3.y
local a = x1 - x2
local b = y1 - y2
local c = x1 - x3
local d = y1 - y3
local e = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0
local f = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0
local det = b * c - a * d
if( math.abs(det) < 0)then
radius = -1
return Vector3(0,0)
end
local x0 = -(d * e - b * f) / det
local y0 = -(a * f - c * e) / det
radius = math.sqrt((x1 - x0)*(x1 - x0)+(y1 - y0)*(y1 - y0))-- hypot(x1 - x0, y1 - y0)
return Vector3(x0, y0),radius
end
2 圆弧方向判断方法
根据p1,p2,p3 的顺序计算圆弧的方向p1_p3的方向是顺时针还是逆时针
设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 所走的方向不变,亦即三点在一直线上。
可以应用在判断三点确定圆弧,圆弧是逆时针画,还是顺势针画。
3 已知圆上p1,p2,p3 三点 求3点的连接成的弧的角度
(应该是夹角 和 弧方向一起决定角度)
0)根据1求出圆心c
1)根据2的知识点求出弧度的方向
2)求出x轴到p1向量的角度,记 angle1,求出x轴到p3向量的角度,记 angle2
3)(1,0) 到 起始点的逆时针角度 angle1,(1,0) 到 终点的逆时针角度 angle2
如果方向是逆时针那么 之间的角度为:angle2-angle1 ,顺时针为 angle1-angle2。如果小于0+360
local vr = UnityEngine.Vector3.Cross(p1_p2, p2_p3)
if(vr.z>0)then--逆时针
moveAngle = angle2-angle1
else--顺时针
moveAngle = angle1-angle2
end
参考文章