精华内容
下载资源
问答
  • matlab空间三点圆心

    万次阅读 热门讨论 2016-05-05 15:19:55
    matlab空间三点圆心
    function p = CircleCenter(p1, p2, p3)
    % CircleCenter(p1, p2, p3) 根据三个空间点,计算出其圆心
    %   p1,p2,p3:三个空间点
     % 圆的法向量
     pf= cross(p1-p2, p1-p3);
    
     if any(pf == 0)
         error('三个点不能共线!!');
     end
    
     % 两条线段的重点,之后需要求中垂线
     p12 = (p1 + p2)/2;
     p23 = (p2 + p3)/2;
    
     % 求两条线的中垂线
     p12f = cross(pf, p1-p2);
     p23f = cross(pf, p2-p3);
    
     % 求在中垂线上投影的大小
     ds = ( (p12(2)-p23(2))*p12f(1) - (p12(1)-p23(1))*p12f(2) ) / ( p23f(2)*p12f(1) - p12f(2)*p23f(1) );
    
     % 得出距离
     p = p23 + p23f .* ds;
    
    end
    
    展开全文
  • 三维平面三点圆心,给出三点,必须在同一平面,计算出所对应的圆心
  • 公式 平面三点 三个已知点的坐标分别记为 (x1,y1)~(x_1,y_1) (x1​,y1​)、 (x2,y2)(x_2,y_2)(x2​,y2​)、 (x3,y3)(x_3,y_3)(x3​,y3​),圆的一般方程可写为二次多项式,即 A(x2+y2)+Bx+Cy+D=0(1a) \tag{1a} A(x^...

    更多阅读:sppy.site

    背景

    如何计算曲线   y ( x )   ~y(x)~  y(x) 上的曲率,而曲线是由若干离散点构成。我的第一反应是根据离散点差分得到一阶导数   y ′   ~y'~  y 和二阶导数   y ′ ′   ~y''~  y ,然后由下式计算
    k = ∣ y ′ ′ ∣ ( 1 + y ′ 2 ) 3 / 2 (0a) \tag{0a} k=\frac{|y''|}{(1+y'^2)^{3/2}} k=(1+y2)3/2y(0a)

    曲线的凹凸方向则由   y ′ ′   ~y''~  y 的符号确定。

    后面,我想到了可以根据曲率的几何意义来计算,即
    k = 1 r (0b) \tag{0b} k=\frac{1}{r} k=r1(0b)

    式中, r   r~ r 是该点的曲率半径,可以通过该点及其两个相邻点得到(不共线的三点确定一个圆)。

    公式

    平面三点

    三个已知点的坐标分别记为   ( x 1 , y 1 ) ~(x_1,y_1)  (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2) ( x 3 , y 3 ) (x_3,y_3) (x3,y3),圆的一般方程可写为二次多项式,即
    A ( x 2 + y 2 ) + B x + C y + D = 0 (1a) \tag{1a} A(x^2+y^2)+Bx+Cy+D=0 A(x2+y2)+Bx+Cy+D=0(1a)

    将式 ( 1 a ) (1\mathrm{a}) (1a)变形可得圆的标准方程,即
    ( x + B 2 A ) 2 + ( y + C 2 A ) 2 = B 2 + C 2 − 4 A D 4 A 2 (1b) \tag{1b} \bigg(x+\frac{B}{2A}\bigg)^2+\bigg(y+\frac{C}{2A}\bigg)^2=\frac{B^2+C^2-4AD}{4A^2} (x+2AB)2+(y+2AC)2=4A2B2+C24AD(1b)

    将三个已知点代入式 ( 1 a ) (1\mathrm{a}) (1a),可得关于   A ~A  A B B B C C C D   D~ D 的齐次线性方程组,即
    [ x 2 + y 2 x y 1 x 1 2 + y 1 2 x 1 y 1 1 x 2 2 + y 2 2 x 2 y 2 1 x 3 2 + y 3 2 x 3 y 3 1 ] ⋅ [ A B C D ] = [ 0 0 0 0 ] (2) \tag{2} \begin{bmatrix} x^2+y^2 & x & y & 1 \\[3pt] x^2_1+y^2_1 & x_1 & y_1 & 1 \\[3pt] x^2_2+y^2_2 & x_2 & y_2 & 1 \\[3pt] x^2_3+y^2_3 & x_3 & y_3 & 1 \end{bmatrix} \cdot \begin{bmatrix} A\\ B\\ C\\ D \end{bmatrix} = \begin{bmatrix} 0\\ 0\\ 0\\ 0 \end{bmatrix} x2+y2x12+y12x22+y22x32+y32xx1x2x3yy1y2y31111ABCD=0000(2)

    显然在三点不共线的前提下,该齐次线性方程组有非零解,其等价于系数矩阵不满秩,即有
    ∣ x 2 + y 2 x y 1 x 1 2 + y 1 2 x 1 y 1 1 x 2 2 + y 2 2 x 2 y 2 1 x 3 2 + y 3 2 x 3 y 3 1 ∣ = 0 (3) \tag{3} \begin{vmatrix} x^2+y^2 & x & y & 1 \\[3pt] x^2_1+y^2_1 & x_1 & y_1 & 1 \\[3pt] x^2_2+y^2_2 & x_2 & y_2 & 1 \\[3pt] x^2_3+y^2_3 & x_3 & y_3 & 1 \end{vmatrix} = 0 x2+y2x12+y12x22+y22x32+y32xx1x2x3yy1y2y31111=0(3)

    将式 ( 3 ) (3) (3)展开,并与式 ( 1 ) (1) (1)对比可得四个系数,即
    A = + ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ (4a) \tag{4a} A=+\begin{vmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \end{vmatrix} A=+x1x2x3y1y2y3111(4a)

    B = − ∣ x 1 2 + y 1 2 y 1 1 x 2 2 + y 2 2 y 2 1 x 3 2 + y 3 2 y 3 1 ∣ (4b) \tag{4b} B=-\begin{vmatrix} x^2_1+y^2_1 & y_1 & 1 \\[3pt] x^2_2+y^2_2 & y_2 & 1 \\[3pt] x^2_3+y^2_3 & y_3 & 1 \end{vmatrix} B=x12+y12x22+y22x32+y32y1y2y3111(4b)

    C = + ∣ x 1 2 + y 1 2 x 1 1 x 2 2 + y 2 2 x 2 1 x 3 2 + y 3 2 x 3 1 ∣ (4c) \tag{4c} C=+\begin{vmatrix} x^2_1+y^2_1 & x_1 & 1 \\[3pt] x^2_2+y^2_2 & x_2 & 1 \\[3pt] x^2_3+y^2_3 & x_3 & 1 \end{vmatrix} C=+x12+y12x22+y22x32+y32x1x2x3111(4c)

    D = − ∣ x 1 2 + y 1 2 x 1 y 1 x 2 2 + y 2 2 x 2 y 2 x 3 2 + y 3 2 x 3 y 3 ∣ (4d) \tag{4d} D=-\begin{vmatrix} x^2_1+y^2_1 & x_1 & y_1 \\[3pt] x^2_2+y^2_2 & x_2 & y_2 \\[3pt] x^2_3+y^2_3 & x_3 & y_3 \end{vmatrix} D=x12+y12x22+y22x32+y32x1x2x3y1y2y3(4d)

    由式 ( 1 b ) (1\mathrm{b}) (1b)可得圆心坐标   ( x c , y c )   ~(x_c,y_c)~  (xc,yc) 和半径   r ~r  r,即
    { x c =   − B 2 A y c =   − C 2 A r =   B 2 + C 2 − 4 A D 4 A 2 (5) \tag{5} \begin{cases} x_c &=~ -\displaystyle\frac{B}{2A} \\[8pt] y_c &=~ -\displaystyle\frac{C}{2A} \\[8pt] r &=~ \sqrt{\displaystyle\frac{B^2+C^2-4AD}{4A^2}} \end{cases} xcycr= 2AB= 2AC= 4A2B2+C24AD (5)

    A   A~ A 可能是负数

    空间三点

    进一步推广到空间中,三个已知点的坐标分别记为   ( x 1 , y 1 , z 1 ) ~(x_1,y_1,z_1)  (x1,y1,z1) ( x 2 , y 2 , z 2 ) (x_2,y_2,z_2) (x2,y2,z2) ( x 3 , y 3 , z 3 ) (x_3,y_3,z_3) (x3,y3,z3)

    空间中确定一个圆至少需要7个参数,一般取:

    1. 圆心   ( x c , y c , z c ) ~(x_c,y_c,z_c)  (xc,yc,zc)
    2. 半径   r ~r  r
    3. 圆所在平面的法向量   ( m , n , p ) ~(m,n,p)  (m,n,p)

    将三个点所在的球的一般方程写作
    A ( x 2 + y 2 + z 2 ) + B x + C y + D z + E = 0 (6a) \tag{6a} A(x^2+y^2+z^2)+Bx+Cy+Dz+E=0 A(x2+y2+z2)+Bx+Cy+Dz+E=0(6a)

    将式 ( 6 a ) (6\mathrm{a}) (6a)变形可得球的标准方程,即
    ( x + B 2 A ) 2 + ( y + C 2 A ) 2 + ( z + D 2 A ) 2 = B 2 + C 2 + D 2 − 4 A E 4 A 2 (6b) \tag{6b} \bigg(x+\frac{B}{2A}\bigg)^2+\bigg(y+\frac{C}{2A}\bigg)^2+\bigg(z+\frac{D}{2A}\bigg)^2=\frac{B^2+C^2+D^2-4AE}{4A^2} (x+2AB)2+(y+2AC)2+(z+2AD)2=4A2B2+C2+D24AE(6b)

    将三个已知点代入式 ( 6 a ) (6\mathrm{a}) (6a),可得关于   A ~A  A B B B C C C D D D E   E~ E 的齐次线性方程组,即
    [ x 2 + y 2 + z 2 x y z 1 x 1 2 + y 1 2 + z 1 2 x 1 y 1 z 1 1 x 2 2 + y 2 2 + z 2 2 x 2 y 2 z 2 1 x 3 2 + y 3 2 + z 3 2 x 3 y 3 z 3 1 ] 4 × 5 ⋅ [ A B C D E ] = [ 0 0 0 0 ] (7) \tag{7} \begin{bmatrix} x^2+y^2+z^2 & x & y & z & 1 \\[3pt] x^2_1+y^2_1+z^2_1 & x_1 & y_1 & z_1 & 1 \\[3pt] x^2_2+y^2_2+z^2_2 & x_2 & y_2 & z_2 & 1 \\[3pt] x^2_3+y^2_3+z^2_3 & x_3 & y_3 & z_3 & 1 \end{bmatrix}_{4\times5} \cdot \begin{bmatrix} A\\ B\\ C\\ D\\ E \end{bmatrix} = \begin{bmatrix} 0\\ 0\\ 0\\ 0 \end{bmatrix} x2+y2+z2x12+y12+z12x22+y22+z22x32+y32+z32xx1x2x3yy1y2y3zz1z2z311114×5ABCDE=0000(7)

    考虑使用式 ( 3 ) (3) (3)中的做法,但式 ( 7 ) (7) (7)中的系数矩阵并非方阵。于是利用三个已知点来确定平面   π ~\pi  π,其方程为
    m x + n y + p z + q = 0 (8) \tag{8} mx+ny+pz+q=0 mx+ny+pz+q=0(8)

    将三个已知点代入式 ( 8 ) (8) (8),可得关于   m ~m  m n n n p p p q   q~ q 的齐次线性方程组,即
    [ x y z 1 x 1 y 1 z 1 1 x 2 y 2 z 2 1 x 3 y 3 z 3 1 ] ⋅ [ m n p q ] = [ 0 0 0 0 ] (9) \tag{9} \begin{bmatrix} x & y & z & 1 \\ x_1 & y_1 & z_1 & 1 \\ x_2 & y_2 & z_2 & 1 \\ x_3 & y_3 & z_3 & 1 \end{bmatrix} \cdot \begin{bmatrix} m\\ n\\ p\\ q \end{bmatrix} = \begin{bmatrix} 0\\ 0\\ 0\\ 0 \end{bmatrix} xx1x2x3yy1y2y3zz1z2z31111mnpq=0000(9)

    同理,在三点不共线的前提下,该齐次线性方程组有非零解,其等价于系数矩阵不满秩。于是将其系数矩阵的行列式展开,并与式 ( 8 ) (8) (8)对比可得四个系数,即
    m = + ∣ y 1 z 1 1 y 2 z 2 1 y 3 z 3 1 ∣ (10a) \tag{10a} m=+\begin{vmatrix} y_1 & z_1 & 1 \\ y_2 & z_2 & 1 \\ y_3 & z_3 & 1 \end{vmatrix} m=+y1y2y3z1z2z3111(10a)

    n = − ∣ x 1 z 1 1 x 2 z 2 1 x 3 z 3 1 ∣ (10b) \tag{10b} n=-\begin{vmatrix} x_1 & z_1 & 1 \\ x_2 & z_2 & 1 \\ x_3 & z_3 & 1 \end{vmatrix} n=x1x2x3z1z2z3111(10b)

    p = + ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ (10c) \tag{10c} p=+\begin{vmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \end{vmatrix} p=+x1x2x3y1y2y3111(10c)

    q = − ∣ x 1 y 1 z 1 x 2 y 2 z 2 x 2 y 3 z 3 ∣ (10d) \tag{10d} q=-\begin{vmatrix} x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \\ x_2 & y_3 & z_3 \end{vmatrix} q=x1x2x2y1y2y3z1z2z3(10d)

    由式 ( 6 b ) (6\mathrm{b}) (6b)可知
    x c = − B 2 A , y c = − C 2 A , z c = − D 2 A (11) \tag{11} x_c=-\frac{B}{2A}, \quad y_c=-\frac{C}{2A}, \quad z_c=-\frac{D}{2A} xc=2AB,yc=2AC,zc=2AD(11)

    考虑到圆心   ( x c , y c , z c )   ~(x_c,y_c,z_c)~  (xc,yc,zc) 也在平面   π   ~\pi~  π 上,于是将式 ( 11 ) (11) (11)代入式 ( 8 ) (8) (8)可得
    2 q A − m B − n C − p D = 0 (12) \tag{12} 2qA-mB-nC-pD=0 2qAmBnCpD=0(12)

    将式 ( 12 ) (12) (12)与式 ( 7 ) (7) (7)结合,可得
    [ x 2 + y 2 + z 2 x y z 1 x 1 2 + y 1 2 + z 1 2 x 1 y 1 z 1 1 x 2 2 + y 2 2 + z 2 2 x 2 y 2 z 2 1 x 3 2 + y 3 2 + z 3 2 x 3 y 3 z 3 1 2 q − m − n − p 0 ] 5 × 5 ⋅ [ A B C D E ] = [ 0 0 0 0 0 ] (13) \tag{13} \begin{bmatrix} x^2+y^2+z^2 & x & y & z & 1 \\[3pt] x^2_1+y^2_1+z^2_1 & x_1 & y_1 & z_1 & 1 \\[3pt] x^2_2+y^2_2+z^2_2 & x_2 & y_2 & z_2 & 1 \\[3pt] x^2_3+y^2_3+z^2_3 & x_3 & y_3 & z_3 & 1 \\[3pt] 2q & -m & -n & -p & 0 \end{bmatrix}_{5\times5} \cdot \begin{bmatrix} A\\ B\\ C\\ D\\ E \end{bmatrix} = \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ 0 \end{bmatrix} x2+y2+z2x12+y12+z12x22+y22+z22x32+y32+z322qxx1x2x3myy1y2y3nzz1z2z3p111105×5ABCDE=00000(13)

    这样,在三点不共线的前提下,该齐次线性方程组有非零解,其等价于系数矩阵不满秩。于是将其系数矩阵的行列式展开,并与式 ( 6 ) (6) (6)对比可得五个系数,即
    A = + ∣ x 1 y 1 z 1 1 x 2 y 2 z 2 1 x 3 y 3 z 3 1 − m − n − p 0 ∣ (14a) \tag{14a} A=+\begin{vmatrix} x_1 & y_1 & z_1 & 1 \\ x_2 & y_2 & z_2 & 1 \\ x_3 & y_3 & z_3 & 1 \\ -m & -n & -p & 0 \end{vmatrix} A=+x1x2x3my1y2y3nz1z2z3p1110(14a)

    B = − ∣ x 1 2 + y 1 2 + z 1 2 y 1 z 1 1 x 2 2 + y 2 2 + z 2 2 y 2 z 2 1 x 3 2 + y 3 2 + z 3 2 y 3 z 3 1 2 q − n − p 0 ∣ (14b) \tag{14b} B=-\begin{vmatrix} x^2_1+y^2_1+z^2_1 & y_1 & z_1 & 1 \\[3pt] x^2_2+y^2_2+z^2_2 & y_2 & z_2 & 1 \\[3pt] x^2_3+y^2_3+z^2_3 & y_3 & z_3 & 1 \\[3pt] 2q & -n & -p & 0 \end{vmatrix} B=x12+y12+z12x22+y22+z22x32+y32+z322qy1y2y3nz1z2z3p1110(14b)

    C = + ∣ x 1 2 + y 1 2 + z 1 2 x 1 z 1 1 x 2 2 + y 2 2 + z 2 2 x 2 z 2 1 x 3 2 + y 3 2 + z 3 2 x 3 z 3 1 2 q − m − p 0 ∣ (14c) \tag{14c} C=+\begin{vmatrix} x^2_1+y^2_1+z^2_1 & x_1 & z_1 & 1 \\[3pt] x^2_2+y^2_2+z^2_2 & x_2 & z_2 & 1 \\[3pt] x^2_3+y^2_3+z^2_3 & x_3 & z_3 & 1 \\[3pt] 2q & -m & -p & 0 \end{vmatrix} C=+x12+y12+z12x22+y22+z22x32+y32+z322qx1x2x3mz1z2z3p1110(14c)

    D = − ∣ x 1 2 + y 1 2 + z 1 2 x 1 y 1 1 x 2 2 + y 2 2 + z 2 2 x 2 y 2 1 x 3 2 + y 3 2 + z 3 2 x 3 y 3 1 2 q − m − n 0 ∣ (14d) \tag{14d} D=-\begin{vmatrix} x^2_1+y^2_1+z^2_1 & x_1 & y_1 & 1 \\[3pt] x^2_2+y^2_2+z^2_2 & x_2 & y_2 & 1 \\[3pt] x^2_3+y^2_3+z^2_3 & x_3 & y_3 & 1 \\[3pt] 2q & -m & -n & 0 \end{vmatrix} D=x12+y12+z12x22+y22+z22x32+y32+z322qx1x2x3my1y2y3n1110(14d)

    E = + ∣ x 1 2 + y 1 2 + z 1 2 x 1 y 1 z 1 x 2 2 + y 2 2 + z 2 2 x 2 y 2 z 2 x 3 2 + y 3 2 + z 3 2 x 3 y 3 z 3 2 q − m − n − p ∣ (14e) \tag{14e} E=+\begin{vmatrix} x^2_1+y^2_1+z^2_1 & x_1 & y_1 & z_1 \\[3pt] x^2_2+y^2_2+z^2_2 & x_2 & y_2 & z_2 \\[3pt] x^2_3+y^2_3+z^2_3 & x_3 & y_3 & z_3 \\[3pt] 2q & -m & -n & -p \end{vmatrix} E=+x12+y12+z12x22+y22+z22x32+y32+z322qx1x2x3my1y2y3nz1z2z3p(14e)

    综上,由式 ( 10 ) (10) (10)得到   m ~m  m n n n p p p q   q~ q ,并由式 ( 14 ) (14) (14)得到   A ~A  A B B B C C C D D D E   E~ E 后,可得圆心坐标   ( x c , y c , z c )   ~(x_c,y_c,z_c)~  (xc,yc,zc) 和半径   r ~r  r,即
    { x c =   − B 2 A y c =   − C 2 A z c =   − D 2 A r =   B 2 + C 2 + D 2 − 4 A E 4 A 2 (15) \tag{15} \begin{cases} x_c &=~ -\displaystyle\frac{B}{2A} \\[8pt] y_c &=~ -\displaystyle\frac{C}{2A} \\[8pt] z_c &=~ -\displaystyle\frac{D}{2A} \\[8pt] r &=~ \sqrt{\displaystyle\frac{B^2+C^2+D^2-4AE}{4A^2}} \end{cases} xcyczcr= 2AB= 2AC= 2AD= 4A2B2+C2+D24AE (15)

    A   A~ A 可能是负数


    程序

    MATLAB代码

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 由圆上三点确定圆心和半径
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % INPUT
    % p1   :  - 第一个点坐标, 行向量 1x3
    % p2   :  - 第二个点坐标, 行向量 1x3
    % p3   :  - 第三个点坐标, 行向量 1x3
    % 若输入1x2的行向量, 末位自动补0, 变为1x3的行向量
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % OUTPUT
    % pc   :  - 圆心坐标, 行向量 1x3
    % r    :  - 半径, 标量
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 调用示例1 - 平面上三个点
    % [pc1,r1]=points2circle([1,2],[-2,1],[0,-3])
    % 调用示例2 - 空间中三个点
    % [pc2,r2]=points2circle([1,2,-1],[-2,1,2],[0,-3,-3])
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    function [pc,r]=points2circle(p1,p2,p3)
    
        % 输入检查
        validateattributes(p1,{'numeric'},{'row'},1);% 行向量
        validateattributes(p2,{'numeric'},{'row'},2);
        validateattributes(p3,{'numeric'},{'row'},3);
        num1=length(p1);num2=length(p2);num3=length(p3);
        if (num1 == num2) && (num2 == num3)
            if num1 == 2
                p1=[p1,0];p2=[p2,0];p3=[p3,0];
            elseif num1 ~= 3
                error('仅支持二维或三维坐标输入');
            end
        else
            error('输入坐标的维数不一致');
        end
    
        % 共线检查
        temp01=p1-p2;temp02=p3-p2;
        temp03=cross(temp01,temp02);
        temp=(temp03*temp03')/(temp01*temp01')/(temp02*temp02');
        if temp < 10^-6
            error('三点共线, 无法确定圆');
        end
    
        mat1=[p1,1;p2,1;p3,1];% size = 3x4
    
        m=+det(mat1(:,2:4));
        n=-det([mat1(:,1),mat1(:,3:4)]);
        p=+det([mat1(:,1:2),mat1(:,4)]);
        q=-det(mat1(:,1:3));
    
        mat2=[[p1*p1';p2*p2';p3*p3'],mat1;2*q,[-m,-n,-p,0]];% size = 4x5
    
        A=+det(mat2(:,2:5));
        B=-det([mat2(:,1),mat2(:,3:5)]);
        C=+det([mat2(:,1:2),mat2(:,4:5)]);
        D=-det([mat2(:,1:3),mat2(:,5)]);
        E=+det(mat2(:,1:4));
    
        pc=-[B,C,D]/2/A;
        r=sqrt(B^2+C^2+D^2-4*A*E)/2/abs(A);
    
    end
    

    Python代码

    ###########################################################################
    # 由圆上三点确定圆心和半径
    ###########################################################################
    # INPUT
    # p1   :  - 第一个点坐标, list或者array 1x3
    # p2   :  - 第二个点坐标, list或者array 1x3
    # p3   :  - 第三个点坐标, list或者array 1x3
    # 若输入1x2的行向量, 末位自动补0, 变为1x3的行向量
    ###########################################################################
    # OUTPUT
    # pc   :  - 圆心坐标, array 1x3
    # r    :  - 半径, 标量
    ###########################################################################
    # 调用示例1 - 平面上三个点
    # pc1, r1 = points2circle([1, 2], [-2, 1], [0, -3])
    # 调用示例2 - 空间中三个点
    # pc2, r2 = points2circle([1, 2, -1], [-2, 1, 2], [0, -3, -3])
    ###########################################################################
    import numpy as np
    from numpy.linalg import det
    
    def points2circle(p1, p2, p3):
        p1 = np.array(p1)
        p2 = np.array(p2)
        p3 = np.array(p3)
        num1 = len(p1)
        num2 = len(p2)
        num3 = len(p3)
    
        # 输入检查
        if (num1 == num2) and (num2 == num3):
            if num1 == 2:
                p1 = np.append(p1, 0)
                p2 = np.append(p2, 0)
                p3 = np.append(p3, 0)
            elif num1 != 3:
                print('\t仅支持二维或三维坐标输入')
                return None
        else:
            print('\t输入坐标的维数不一致')
            return None
    
        # 共线检查
        temp01 = p1 - p2
        temp02 = p3 - p2
        temp03 = np.cross(temp01, temp02)
        temp = (temp03 @ temp03) / (temp01 @ temp01) / (temp02 @ temp02)
        if temp < 10**-6:
            print('\t三点共线, 无法确定圆')
            return None
    
        temp1 = np.vstack((p1, p2, p3))
        temp2 = np.ones(3).reshape(3, 1)
        mat1 = np.hstack((temp1, temp2))  # size = 3x4
    
        m = +det(mat1[:, 1:])
        n = -det(np.delete(mat1, 1, axis=1))
        p = +det(np.delete(mat1, 2, axis=1))
        q = -det(temp1)
    
        temp3 = np.array([p1 @ p1, p2 @ p2, p3 @ p3]).reshape(3, 1)
        temp4 = np.hstack((temp3, mat1))
        temp5 = np.array([2 * q, -m, -n, -p, 0])
        mat2 = np.vstack((temp4, temp5))  # size = 4x5
    
        A = +det(mat2[:, 1:])
        B = -det(np.delete(mat2, 1, axis=1))
        C = +det(np.delete(mat2, 2, axis=1))
        D = -det(np.delete(mat2, 3, axis=1))
        E = +det(mat2[:, :-1])
    
        pc = -np.array([B, C, D]) / 2 / A
        r = np.sqrt(B * B + C * C + D * D - 4 * A * E) / 2 / abs(A)
    
        return pc, r
    

    展开全文
  • MATLAB 平面三点生成圆弧

    千次阅读 2019-03-08 10:38:06
    MATLAB新手,最近要写一个程序,参考了多个百度的结果以及https://blog.csdn.net/libing403/article/details/78234640?utm_source=blogxgwz6这篇文章提供的方法,自己想了一个办法,目前测试过的点都成功了,所以想...

    MATLAB新手,最近要写一个程序,参考了多个百度的结果以及https://blog.csdn.net/libing403/article/details/78234640?utm_source=blogxgwz6这篇文章提供的方法,自己想了一个办法,目前测试过的点都成功了,所以想给大家分享一下。欢迎大家指出错误和不足(๑╹◡╹)ノ"""。

    %判断是圆还是圆弧
    if get(handles.rad_round_1,'value')
        round_flag=1;
    elseif get(handles.rad_round_2,'value')
        round_flag=2;
    else
        warndlg('请选择圆或圆弧^-^','提示','modal')
    end
    
    %输入三个点的坐标
    
    %%获取三点所在圆圆心及半径
    x0=[x1 x2 x3]';
    y0=[y1 y2 y3]';
    TR=triangulation([1,2,3],x0,y0); %表示成三角网格
    [D,r]=circumcenter(TR);         %利用内置函数求外接圆心和半径
    a=D(1);b=D(2);                  %圆心(a,b)  半径 r
    
    %开始生成
    switch(round_flag)
        case 1                      %根据圆心半径生成圆
            deg=0:0.01:360;
            rx=a+r*cos(deg);
            ry=b+r*sin(deg);
            plot(a,b,'*r');hold on;
            plot(x0,y0,'ro');hold on;
            plot(rx,ry,'g');hold on;
        case 2                      %根据圆心半径生成圆弧
            A=[x1 y1 0];B=[x2 y2 0];C=[x3 y3 0];
            AB=B-A;BC=C-B;
            dis=cross(AB,BC);
            if dis(3)==0
                warndlg('三点共线,请重新输入坐标^-^','提示','modal')
            else
                e=c_theta(x1,y1,a,b);
                f=c_theta(x2,y2,a,b);
                g=c_theta(x3,y3,a,b);
                if max(max(e,f),g)==e
                    if f>g
                        deg=e:-0.1:g;
                    else
                        deg=e:0.1:(360+g);
                    end
                elseif max(max(e,f),g)==f
                    if e>g
                        deg=e:0.1:(g+360);
                    else
                        deg=e:-0.1:(g-360);
                    end
                elseif max(max(e,f),g)==g
                    if e>f
                        deg=e:-0.1:(g-360);
                    else
                        deg=e:0.1:g;
                    end
                end
                rx=a+r*cosd(deg);
                ry=b+r*sind(deg);
                plot(a,b,'*r');hold on;
                plot(x0,y0,'ro');hold on;
                plot(rx,ry,'g');hold on;
            end
    end
    
    set(gca,'XAxisLocation','origin');
    set(gca,'YAxisLocation','origin');
    axis equal
    hold on;grid on;
    
    %判断输入点的角度
    function theta=c_theta(x,y,a,b)
    theta=atand((y-b)/(x-a));
    if x >= a
        if y >= b
            theta=theta;     %第一象限
        elseif y<b
            theta=theta+360;           %第四象限
        end
    else 
        if y >= b
            theta=theta+180;     %第二象限
        elseif y<b
            theta=theta+180;           %第三象限
        end
    end
    
    

     

    展开全文
  • 三点求圆公式Matlab 和C++版程序

    千次阅读 2018-09-25 20:42:00
    三点求圆公式Matlab 和C++版程序 %% 给定三个点做圆弧轨迹规划 function P_P=plot_circle(p1,p2,p3) %% 利用这三个点做一个平面方程 k_11=( p1(2)-p3(2) )*( p2(3)-p3(3) ) - ( p2(2)-p3(2) )*( p1(3)-p3(3)...

    三点求圆公式Matlab 和C++版程序

    %% 给定三个点做圆弧轨迹规划
    function P_P=plot_circle(p1,p2,p3)
    
    %% 利用这三个点做一个平面方程
    
    k_11=( p1(2)-p3(2) )*( p2(3)-p3(3) ) - ( p2(2)-p3(2) )*( p1(3)-p3(3) ) ;
    k_12=( p2(1)-p3(1) )*( p1(3)-p3(3) ) - ( p1(1)-p3(1) )*( p2(3)-p3(3) ) ;
    k_13=( p1(1)-p3(1) )*( p2(2)-p3(2) ) - ( p2(1)-p3(1) )*( p1(2)-p3(2) ) ;
    k_14= -( k_11*p3(1) + k_12*p3(2) + k_13*p3(3) );
    
    %% 过p1 p2的中点并且和 p1p2 垂直的平面方程 
    k_21=p2(1)-p1(1);
    k_22=p2(2)-p1(2);
    k_23=p2(3)-p1(3);
    k_24= -( ( p2(1)^2-p1(1)^2 ) + ( p2(2)^2-p1(2)^2 ) + ( p2(3)^2-p1(3)^2 )  )/2;
    
    
    %% 过p2 p3的中点并且和 p2p3 垂直的平面方程 
    k_31=p3(1)-p2(1);
    k_32=p3(2)-p2(2);
    k_33=p3(3)-p2(3);
    k_34=-( ( p3(1)^2-p2(1)^2 ) + ( p3(2)^2-p2(2)^2 ) + ( p3(3)^2-p2(3)^2 )  )/2;
    
    
    %% 圆心肯定在这三个平面上面。利用点法式方程求得圆心
    K_123=[k_11 k_12 k_13;k_21 k_22 k_23;k_31 k_32 k_33];
    k_4=[-k_14;-k_24;-k_34];
    
    C=inv(K_123)*k_4;
    
    R=sqrt(   ( C(1)-p1(1) )^2 +  ( C(2)-p1(2) )^2 + ( C(3)-p1(3) )^2 );
    
    
    
    %% 以这个三个点重新确立一个空间直角坐标系
    
    %% K_11 k_12 k_13 是和 p1p2p3 所在平面垂直的法向量, 故取该法向量的单位向量为 Z轴
    W_x=k_11/sqrt(k_11^2+k_12^2+k_13^2);
    W_y=k_12/sqrt(k_11^2+k_12^2+k_13^2);
    W_z=k_13/sqrt(k_11^2+k_12^2+k_13^2);
    
    
    %% 以 Op1 的单位向量 为 X 轴
    U_x= ( p1(1)- C(1) )/R ;
    U_y= ( p1(2)- C(2) )/R ;
    U_z= ( p1(3)- C(3) )/R ;
    
    %% 确定 Y 轴,为 Z 轴和 X轴的叉乘
    V_x= W_y*U_z-W_z*U_y;
    V_y= W_z*U_x-W_x*U_z;
    V_z= W_x*U_y-W_y*U_x;
    
    
    T=[U_x V_x W_x C(1);
       U_y V_y W_y C(2);
       U_z V_z W_z C(3);
       0    0   0    1];
    
    
    %% 对向量坐标进行相应的齐次化
    p1=[p1;1];
    p2=[p2;1];
    p3=[p3;1];
    n_p1=inv(T)*p1;
    n_p2=inv(T)*p2;
    n_p3=inv(T)*p3;
    n_p1=n_p1(1:3);
    n_p2=n_p2(1:3);
    n_p3=n_p3(1:3);
    
    
    %% 求圆心角
    %% 为了方便求这三个点之间的顺序,还需要求得这三个点的圆心角,因为atan2 的角度范围是 -pi pi,故统一进行变换为正的角度
    theta_p2_o_p1=atan2(n_p2(2),n_p2(1));
    if theta_p2_o_p1 < 0
        theta_p2_o_p1=theta_p2_o_p1+2*pi;
    end
    
    theta_p3_o_p1=atan2(n_p3(2),n_p3(1));
    if theta_p3_o_p1 < 0
        theta_p3_o_p1=theta_p3_o_p1+2*pi;
    end
    
    %% 经过上面的变换之后,如果 p1p2 的角度 小于 p1p3 的角度,那么就是逆时针转,反之就是顺时针转。
    if theta_p2_o_p1 < theta_p3_o_p1
        dir=1;
    else
        dir=-1;
    end
    
    
    %% 用五次多项式进行圆弧插补 
    delta_t=0.5;
    t=0:delta_t:10;
    
    nm=Five_ploynomial(0,10,0,1,0,0,0,0);
    
    n=size(nm);
    
    
    for i=1:1:n(2)
        u(i)=R*cos(nm(i)*dir*theta_p3_o_p1);
        v(i)=R*sin(nm(i)*dir*theta_p3_o_p1);
        w(i)=0;
    end
    
    
    
    for j=1:1:i
        p=T*[u(j);v(j);w(j);1];
        x(j)=p(1);
        y(j)=p(2);
        z(j)=p(3);
    end
      
    P_P=[x;y;z];
    end
    
    function qt=Five_ploynomial(t0,tf,q0,qf,d_q0,d_qf,dd_q0,dd_qf)
    
        A = ( 12*(qf - q0) - 6*(d_qf+d_q0)*tf - (dd_q0-dd_qf)*tf^2 ) /(2*tf^5);
    	B = ( -30*(qf - q0) + (16*d_q0 + 14*d_qf)*tf  + (3*dd_q0-2*dd_qf)*tf^2 ) / (2*tf^4);
    	C = ( 20*(qf - q0) - (12*d_q0 + 8*d_qf)*tf - (3*dd_q0-dd_qf)*tf^2 ) / (2*tf^3);
        D=dd_q0/2;
    	E = d_q0; 
    	F = q0;
    
    i=1;
       for t=t0:0.5:tf
           qt(i)=A*t^5+B*t^4+C*t^3+D*t^2+E*t+F;
           i=i+1;
       end
    
    
    
    end
    
    

    C++ 版程序

    void plot_circle(Vector3d & p1, Vector3d & p2, Vector3d & p3,MatrixXd& XYZ)
    {
    	//利用这三个点做一个平面方程
    
    	double k_11 = (p1(1) - p3(1))*(p2(2) - p3(2)) - (p2(1) - p3(1))*(p1(2) - p3(2));
    	double k_12 = (p2(0) - p3(0))*(p1(2) - p3(2)) - (p1(0) - p3(0))*(p2(2) - p3(2));
    	double k_13 = (p1(0) - p3(0))*(p2(1) - p3(1)) - (p2(0) - p3(0))*(p1(1) - p3(1));
    	double k_14 = -(k_11*p3(0) + k_12*p3(1) + k_13*p3(2));
    
    	// 过p1 p2的中点并且和 p1p2 垂直的平面方程
    	double k_21 = p2(0) - p1(0);
    	double k_22 = p2(1) - p1(1);
    	double k_23 = p2(2) - p1(2);
    	double k_24 = -( (  pow(p2(0) , 2) - pow(p1(0) , 2) ) + ( pow( p2(1) , 2)  - pow( p1(1),2) ) + ( pow( p2(2) , 2)  - pow( p1(2) , 2) )) / 2;
    
    
    	// 过p2 p3的中点并且和 p2p3 垂直的平面方程
    	double k_31 = p3(0) - p2(0);
    	double k_32 = p3(1) - p2(1);
    	double k_33 = p3(2) - p2(2);
    	double k_34 =  -((pow(p3(0), 2) - pow(p2(0), 2)) + (pow(p3(1), 2) - pow(p2(1), 2)) + (pow(p3(2), 2) - pow(p2(2), 2))) / 2;
    
    
    	// 圆心肯定在这三个平面上面。利用点法式方程求得圆心
    	Matrix3d  K_123=Matrix3d::Zero(); 
    	K_123 <<  k_11, k_12, k_13, k_21, k_22, k_23, k_31, k_32, k_33;
    	Vector3d   k_4 = Vector3d::Zero();
    	k_4<< -k_14, -k_24, -k_34;
    
    	Vector3d C =( K_123.inverse()*k_4);
    
    	double R = sqrt( pow ( (C(0) - p1(0)),2) +  pow ( (C(1) - p1(1)),2) +  pow ( (C(2) - p1(2)),2));
    
    
    
    	// 以这个三个点重新确立一个空间直角坐标系
        // K_11 k_12 k_13 是和 p1p2p3 所在平面垂直的法向量, 故取该法向量的单位向量为 Z轴
    	double W_x = k_11 / sqrt(pow( k_11,2) + pow( k_12,2) + pow( k_13,2));
    	double W_y = k_12 / sqrt(pow( k_11,2) + pow( k_12,2) + pow( k_13,2));
    	double W_z = k_13 / sqrt(pow( k_11,2) + pow( k_12,2) + pow( k_13,2));
    
    
    	// 以 Op1 的单位向量 为 X 轴
    	double 	U_x = (p1(0) - C(0)) / R;
    	double 	U_y = (p1(1) - C(1)) / R;
    	double 	U_z = (p1(2) - C(2)) / R;
    
    	// 确定 Y 轴,为 Z 轴和 X轴的叉乘
    	double 	V_x = W_y*U_z - W_z*U_y;
    	double 	V_y = W_z*U_x - W_x*U_z;
    	double 	V_z = W_x*U_y - W_y*U_x;
    
    
    	Matrix4d T = Matrix4d::Zero();
    	          T<< U_x, V_x, W_x, C(0),
    	              U_y, V_y, W_y, C(1),
    	              U_z, V_z, W_z, C(2),
    	              0,    0,   0,    1;
    
    	// 对向量坐标进行相应的齐次化
    			  Vector4d p1_new; 
    			  Vector4d p2_new; 
    			  Vector4d p3_new; 
    			  p1_new << p1(0), p1(1), p1(2), 1;
    			  p2_new << p2(0), p2(1), p2(2), 1;
    			  p3_new << p3(0), p3(1), p3(2), 1;
    			  Vector4d n_p1 = T.inverse()*p1_new;
    			  Vector4d n_p2 = T.inverse()*p2_new;
    			  Vector4d n_p3 = T.inverse()*p3_new;
    
    	//求圆心角
    	//为了方便求这三个点之间的顺序,还需要求得这三个点的圆心角,因为atan2 的角度范围是 - pi pi, 故统一进行变换为正的角度
    	double theta_p2_o_p1 = atan2(n_p2(1), n_p2(0));
    	if ( theta_p2_o_p1 < 0 )
    		theta_p2_o_p1 = theta_p2_o_p1 + 2 * pi;
    	double theta_p3_o_p1 = atan2(n_p3(1), n_p3(0));
    	if ( theta_p3_o_p1 < 0 )
    		theta_p3_o_p1 = theta_p3_o_p1 + 2 * pi;
    	//经过上面的变换之后,如果 p1p2 的角度 小于 p1p3 的角度,那么就是逆时针转,反之就是顺时针转。
    	int dir = 1;
    	if( theta_p2_o_p1 < theta_p3_o_p1 )
    		dir = 1;
    	else
    		dir = -1;
    
    	// 用五次多项式进行圆弧插补
    	double t0 = 0;
    	double tf = 10;
    	double delta_t = 0.5;
    	int n = (tf - t0) / delta_t + 1;
    	VectorXd qt(n);
    
    	Five_ploynomial(0, 10, 0, 1, 0, 0, 0, 0,qt);
    	VectorXd u(n);
    	VectorXd v(n);
    	VectorXd w(n);
    	VectorXd x(n);
    	VectorXd y(n);
    	VectorXd z(n);
    	for (int i = 0; i < n; ++i)
    	{
    		u(i) = R*cos(qt(i)*dir*theta_p3_o_p1);
    		v(i) = R*sin(qt(i)*dir*theta_p3_o_p1);
    		w(i) = 0;
    
    	}
    
    	for (int j = 0; j < n; ++j)
    	{
    		Vector4d temp;
    		temp << u(j), v(j), w(j), 1;
    		Vector4d p = T*temp;
    		XYZ(j,0) = p(0);
    		XYZ(j, 1) = p(1);
    		XYZ(j, 2) = p(2);
    	}
    
    
    }
    void  Five_ploynomial(double t0, double tf, double q0, double qf, double d_q0, double d_qf, double dd_q0, double  dd_qf, VectorXd & qt)
    {
    	double A, B, C, D, E, F;
    
    	A = (double(12.00 * (qf - q0)) - 6 * (d_qf + d_q0)*tf - (dd_q0 - dd_qf)*pow(tf, 2)) / (2 * pow(tf, 5));
    	B = (double(-30 * (qf - q0) + (16 * d_q0 + 14 * d_qf)*tf + (3 * dd_q0 - 2 * dd_qf)*pow(tf, 2))) / (2 * pow(tf, 4));
    	C = (double(20 * (qf - q0) - (12 * d_q0 + 8 * d_qf)*tf - (3 * dd_q0 - dd_qf)*pow(tf, 2))) / (2 * pow(tf, 3));
    	D = dd_q0 / 2;
    	E = d_q0;
    	F = q0;
    
    	double i = 0;
    	for (double t = 0; t < tf + 0.5; t = t + 0.5)
    	{
    		qt(i) = A*pow(t, 5) + B*pow(t, 4) + C*pow(t, 3) + D*pow(t, 2) + E*t + F;
    		i = i + 1;
    	}
    
    }
    
    展开全文
  • 通过三个不共线的平面点绘制圆形/MATLAB实现 1: 三个不共线的点求解圆心和半径 假设三个不共线的点的坐标分别为P1(x1,y1)、P2(x2,y2)P1(x1,y1)、P2(x2,y2)P1(x1,y1)、P2(x2,y2)和P3(x3,y3)P3(x3,y3)P3(x3,y3),设过...
  • MATLAB平面几何图形绘制实例

    千次阅读 2018-02-28 00:55:42
    MATLAB平面几何图形绘制实例实例一、运动控制测试图形%以下图形用于运动综合测试,平面图形包含直线、圆弧、整圆、锐拐角、钝拐角,能比较充分的测试各种轨迹 运动控制性能。%输入圆心和半径可以调整图形大小和偏移...
  • matlab在三维空间中三点绘制圆弧

    千次阅读 2021-11-17 20:43:42
    P1=[0.4,0.6,0.4]; P2=[0.48,0.63,0.52]; P3=[0.85,0.3,0.3]; P=[P1;P2;P3]; % | x1 y1 z1 | ... % 三点的xyz坐标正好是合拼成3x3的矩阵,这里用3x3的随机矩阵测试 ... % 实际使用中,将已知的三点坐标按上述顺.
  • 已知三个球面点rsp1,rsp2,rsp3,并且已知球心在平面y+z=0上,求解球心坐标(a,b,c) clear all;clc; syms a b c rsp1=[ 0.0000000000E+000 -1.3289204963E-001 5.6539310386E-001]; %球面点1坐标 rsp2=[ 0....
  • 三维空间确定一个圆弧的一种方法

    千次阅读 2020-08-22 11:51:18
    已知圆心(x0,y0,z0),圆弧上起点(x1,y1,z1),圆弧终点(x2,y2,z2),弧方向(xt,yt,zt) 已知圆心(x0,y0,z0),圆弧上起点(x1,y1,z1),弧方向(xt,yt,zt),弧度 θ 无论哪种方法,都觉得需要好多参数,并且...
  • Newsgroups: comp.graphics,sci.image.processing,comp.graphics.algorithms From: orourke@sophia.smith.edu (Joseph O'Rourke) Subject: Re: Center of circle from 3 edge points Orga...
  • 最佳二乘圆的推导和Matlab实现 1 理论推导 最近在学习的过程中需要使用最佳二乘圆和最佳二乘椭圆以及其他一些最佳二乘的二次曲线,恰巧又刚好学过一点矩阵论。刚好拿来练习一下。 首先搞清楚问题,最佳二乘拟合圆,...
  • 平面点群最小包络圆模型与计算 1 问题描述 很多材料与口头表述中出现了这样一个句子:“求多边形最小外接圆”。事实上这样的描述是不准确的,多边形的外接圆指与多边形各顶点都相交的圆,若多边形存在外接圆,则...
  • matlab实现泰森多边形

    2020-04-27 10:19:18
    泰森多边形介绍 泰森多边形是对空间平面的一种剖分,其特点是多边形内的任何位置离该多边形的样点(如居民点)的距离最近,离相邻多边形内样点的距离远,且每个多边形内含且仅包含一个样点。由于泰森多边形在空间...
  • 泰森多边形(Voronoi图)的matlab绘制

    万次阅读 多人点赞 2018-09-02 22:57:59
    泰森多边形(Voronoi图)的matlab绘制 1.泰森多边形的介绍 泰森多边形是对空间平面的一种剖分,其特点是多边形内的任何位置离该多边形的样点(如居民点)的距离最近,离相邻多边形内样点的距离远,且每个...
  • 泰森多边形(Voronoi图)的matlab绘制——彩图版 1 Voronoi图简介 泰森多边形是对空间平面的一种剖分,其特点是多边形内的任何位置离该多边形的样点(如居民点)的距离最近,离相邻多边形内样点的距离远,...
  • 三维离散点最优空间圆拟合及实现

    千次阅读 2020-06-24 10:57:55
    已知三维空间离散点坐标(xi, yi, zi),构建一个空间圆使得空间点尽可能靠近拟合的空间圆。效果如下图 ...首先,所有离散点尽可能在一个平面上,平面方程可表示为 (1) 写成矩阵形式为, ,式中 ,, ...
  • MATLAB实现三角剖分(Delaunay)算法

    万次阅读 多人点赞 2017-08-19 11:31:53
    那么该点集V的一个三角剖分T = (V,E)是一个平面图G,该平面图满足条件:  1、除了端点,平面图中的边不包含点集中的任何点。  2、没有相交边。// 边和边没有交叉点。  3、平面图中所有的面都是三角面,且所
  • Delaunay三角剖分及matlab实例

    万次阅读 多人点赞 2017-03-30 16:25:24
     计算该三角形的圆心和半径  如果该点在外接圆的右侧  则该三角形为Delaunay三角形,保存到triangles  并在temp里去除掉  跳过  如果该点在外接圆外(即也不是外接圆右侧)  则该三角形为不确定 //后面会在...
  • 基于MATLAB的车道线识别算法研究一、课题背景为了提高车道线识别算法的实时性和准确性,提出了一种基于改进Hough变换的车道线检测方法。在车道线的预处理阶段,首先确定图像中的感兴趣区域,然后对图像进行平滑处理...
  • %三点确定的面的方程 A2 = 2(x2-x1); B2 = 2*(y2-y1); C2 = 2*(z2-z1); D2 = x12+y12+z1^2 - x22-y22-z2^2; A3 = 2*(x3-x1); B3 = 2*(y3-y1); C3 = 2*(z3-z1); D3 = x12+y12+z1^2 - x32-y32-z3^2; T = [A1 B1 C1;A2...
  • Matlab绘图

    2020-08-12 18:09:23
    Matlab绘图颜色形状线型标记图例 颜色 颜色字符串有’c’, ‘m’, ‘y’, ‘r’, ‘g’, ‘b’, ‘w’,和’k’。分别表示青,红紫,黄,红,绿,白和黑。 shading interp 在网格片内采用颜色插值处理,得出表面图...
  • 那么这三个点可以唯一确定一个外接圆,该园所在平面 M 1 M_{1} M1​的方程如下: ∣ x − x 3 y − y 3 z − z 3 x 1 − x 3 y 1 − y 3 z 1 − z 3 x 2 − x 3 y 2 − y 3 z 2 − z 3 ∣ = 0 ( 8 ) \left|\begin{...
  • (转载)MatLab绘图

    2019-09-28 09:58:53
     MATLAB提供了一些绘图选项,用于确定所绘曲线的线型、颜色和数据点标记符号,它们可以组合使用。例如,“b-.”表示蓝色点划线,“y:d”表示黄色虚线并用菱形符标记数据点。当选项省略时,MATLAB规定,线型一律用...
  • 在二维空间中对圆的拟合较为简单,由初中的几何知识我们可以知道,确定一个三角形至少需要三个不共线的点,因此确定一个三角形的外接圆至少可用三个点。我们不妨假设三个点坐标为P1(x1,y1,z1),P2(x2,y2,...
  • 最小圆覆盖问题指平面上有n个点,给定n个点的坐标,找到一个半径最小的圆,将n个点全部包围,点可以在圆上。 求最小圆覆盖问题的方法有很多种。一步一步学习。 先介绍增量法的实现步骤。 目录 点增量法 三角形...
  • ② 根据平面上的三点圆心坐标,由于圆心坐标必然通过x=bx/2,因此设P1-uvw坐标系下的圆心的坐标为(bx/2,h),对应标准方程为: 可以求解得到: ③ 将圆心坐标转化为O-xyz下的坐标,通过向量的加减获取圆心坐标,...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 313
精华内容 125
关键字:

matlab平面三点确定圆心

matlab 订阅