两圆交点计算代码:
private Point[] Arc_CrossP(int[] A,int[] B)
{
double Ax = A[0], Ay = A[1], Ar = A[2];
double Bx = B[0], By = B[1], Br = B[2];
//-------------------------------------
double dx = Ax - Bx; //X轴方向差距
double dy = Ay - By; //Y轴方向差距
double d = Math.Sqrt(dx * dx + dy * dy);//两圆心的距离
if (d > 0)
{
double a = (Ar * Ar - Br * Br + d * d) / (d * 2); //圆交点的弦与圆心连线交点 到A圆的圆心距离
double Ex = Ax + a * (Bx - Ax) / d; //圆交点的弦与圆心连线交点 X坐标
double Ey = Ay + a * (By - Ay) / d; //圆交点的弦与圆心连线交点 Y坐标
double h = Math.Sqrt(Ar * Ar - a * a); //圆交点的弦与圆心连线交点 到圆交点的距离
double z = h / d; //比率
if (d < Ar + Br && d > Math.Abs(Ar - Br)) //正常有两个交点的情况
{
return new Point[] { new Point((int)(Ex-z*(By-Ay)), (int)(Ey + z * (Bx - Ax))),
new Point((int)(Ex+z*(By-Ay)), (int)(Ey - z * (Bx - Ax)))};
}
else if (d > Ar + Br || d < Math.Abs(Ar - Br)) //两个圆没有交点
return null;
else
return new Point[] { new Point((int)Ex, (int)Ey) }; //正常有1个交点的情况(内切&外切)
}
else return null; //d=0,,两圆同心,求交点是没有意义的。
}
三角形内随机点:
local r1 = math.random() --[0,1)范围
local r2 = math.random() --[0,1)范围
local tbRet = {}
local sqrt_r1 = math.sqrt(r1)
tbRet.X = (1 - sqrt_r1)*Point1.X + sqrt_r1*(1 - r2)*Point2.X + sqrt_r1*r2*Point3.X
tbRet.Y = (1 - sqrt_r1)*Point1.Y + sqrt_r1*(1 - r2)*Point2.Y + sqrt_r1*r2*Point3.Y
tbRet.Z = 0
参考: