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

时间:2016-05-28 15:45:44

标签: java math vector dicom equations

我试图从两个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;     
}

1 个答案:

答案 0 :(得分:1)

从类名称我想ImagePositionPatient在平面上给出一个点(比如 a ),而ImageOrientationPatient(比如 n )给出了正常。 (我不会知道这是正确的,但既然你告诉我他们是3D矢量,这就是我想到的。)

然后您的平面方程由dot(n, a) = dot(n, x)给出,其中 x 是位置变量, n 是标准化的。这给出了Ax + By + Cz = D这是笛卡尔方程。