如何用三点两向量计算平面方程?

how to calculate plane equation using three points and two vectors?

我正在尝试从两个 dicom 图像的数据计算两个平面方程,并从这两个平面方程得到一条交线。 dicom 标签 ImagePositionPatient 具有三个坐标 x、y、z,标签 ImageOrientationPatient 具有两个向量,每个向量具有三个分量。 这三个坐标和两个向量如何计算平面方程?

这是我的代码:

public void ShowLocalizerLine(View v)
{
    //Getting The Values
    InfoOfFirst();  //This gets the img position and orientation of src img
    InfoOfSecond(); //This gets the img position and orientation of dst img
    String[] src_position_array = new String[3];
    src_position_array = firstimg_position.split("\\");
    Src_Position_Xo = Float.parseFloat(src_position_array[0]);
    Src_Position_Yo = Float.parseFloat(src_position_array[1]);
    Src_Position_Zo = Float.parseFloat(src_position_array[2]);

    String[] src_orientation_array = new String[6];
    src_orientation_array = firstimg_orientation.split("\\");
    Src_Orientation_Vector1_A = Float.parseFloat(src_orientation_array[0]);
    Src_Orientation_Vector1_B = Float.parseFloat(src_orientation_array[1]);
    Src_Orientation_Vector1_C = Float.parseFloat(src_orientation_array[2]);
    Src_Orientation_Vector2_D = Float.parseFloat(src_orientation_array[3]);
    Src_Orientation_Vector2_E = Float.parseFloat(src_orientation_array[4]);
    Src_Orientation_Vector2_F = Float.parseFloat(src_orientation_array[5]);

    String[] dst_position_array = new String[3];
    dst_position_array = secimg_position.split("\\");
    Dst_Position_Xo = Float.parseFloat(dst_position_array[0]);
    Dst_Position_Yo = Float.parseFloat(dst_position_array[1]);
    Dst_Position_Zo = Float.parseFloat(dst_position_array[2]);

    String[] dst_orientation_array = new String[6];
    dst_orientation_array = secimg_orientation.split("\\");
    Dst_Orientation_Vector1_A = Float.parseFloat(dst_orientation_array[0]);
    Dst_Orientation_Vector1_B = Float.parseFloat(dst_orientation_array[1]);
    Dst_Orientation_Vector1_C = Float.parseFloat(dst_orientation_array[2]);
    Dst_Orientation_Vector2_D = Float.parseFloat(dst_orientation_array[3]);
    Dst_Orientation_Vector2_E = Float.parseFloat(dst_orientation_array[4]);
    Dst_Orientation_Vector2_F = Float.parseFloat(dst_orientation_array[5]);

    //Calculations
    float dst_nrm_dircos_x = Dst_Orientation_Vector1_B*Dst_Orientation_Vector2_F - Dst_Orientation_Vector1_C*Dst_Orientation_Vector2_E;
    float dst_nrm_dircos_y = Dst_Orientation_Vector1_C*Dst_Orientation_Vector2_D - Dst_Orientation_Vector1_A*Dst_Orientation_Vector2_F;
    float dst_nrm_dircos_z = Dst_Orientation_Vector1_A*Dst_Orientation_Vector2_E - Dst_Orientation_Vector1_B*Dst_Orientation_Vector2_D;

    float src_pos_x = Src_Position_Xo - Dst_Position_Xo;
    float src_pos_y = Src_Position_Yo - Dst_Position_Yo;
    float src_pos_z = Src_Position_Zo - Dst_Position_Zo;
    float dst_pos_x = Dst_Orientation_Vector1_A*src_pos_x + Dst_Orientation_Vector1_B*src_pos_y + Dst_Orientation_Vector1_C*src_pos_z;
    float dst_pos_y = Dst_Orientation_Vector2_D*src_pos_x + Dst_Orientation_Vector2_E*src_pos_y + Dst_Orientation_Vector2_F*src_pos_z;
    float dst_pos_z = dst_nrm_dircos_x*src_pos_x + dst_nrm_dircos_y*src_pos_y + dst_nrm_dircos_z*src_pos_z;     
}

从class的名字我猜ImagePositionPatient在平面上给出了一个点(比如a)和ImageOrientationPatient(比如n) 给出了正常值。 (我不会 知道 这是正确的,但既然你告诉我它们是 3D 矢量,这就是我的想法)。

那么你的平面方程由dot(n, a) = dot(n, x)给出,其中x是位置变量,n被归一化。这给出了 Ax + By + Cz = D 这是笛卡尔方程。