close

p0離紅色線段最近的點,即本身所在位置(1,0,0), 所以距離平方為0

p1離紅色線段最近的點(1, 0, 0), 距離平方為4

image

image

// DistancePointToLine.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"
#include <vtkSmartPointer.h>
#include <vtkLine.h>
#include <vtkPoints.h>

int _tmain(int argc, _TCHAR* argv[])
{
double lineP0[3] = {0.0, 0.0, 0.0};
double lineP1[3] = {1.0, 0.0, 0.0};
double p0[3] = {1.0, 0, 0};
double p1[3] ={ 1.0, 2.0, 0};
/*
vtkSmartPointer<vtkLine> line =
vtkSmartPointer<vtkLine>::New();
line->GetPoints()->SetPoint(0, lineP0);
line->GetPoints()->SetPoint(0, lineP1);
*/

{
double dist0 = vtkLine::DistanceToLine(p0, lineP0, lineP1);
std::cout << "Dist0: " << dist0 << std::endl;

double dist1 = vtkLine::DistanceToLine(p1, lineP0, lineP1);
std::cout << "Dist1: " << dist1 << std::endl;
}

{
double t;
double closest[3];
double dist0 = vtkLine::DistanceToLine(p0, lineP0, lineP1, t, closest);
std::cout << "Dist0: " << dist0 << " closest point: " << closest[0] << " " << closest[1] << " " << closest[2] << std::endl;

double dist1 = vtkLine::DistanceToLine(p1, lineP0, lineP1, t, closest);
std::cout << "Dist1: " << dist1 << " closest point: " << closest[0] << " " << closest[1] << " " << closest[2] << std::endl;
}
char c;
std::cin >> c;
return 0;
}



image

=======================================================

p0離紅色線段最近的點,即本身所在位置(1,0,0), 所以距離平方為0

p1離紅色線段最近的點(0.5, 0.5, 0), 距離平方為0.5

double lineP0[3] = {0.0, 1.0, 0.0};
double lineP1[3] = {1.0, 0.0, 0.0};
double p0[3] = {1.0, 0, 0};
double p1[3] ={ 1.0, 1.0, 0};

image

image

==========================================================

p1離紅色線段最近的點, 並不會是p0, 而是紅色點的最左邊端點座標即(2,0,0)

原本預期可以將p1投影在紅色線段延伸交會在(1,0,0)

image

image

ActViz版本:

加入參考Kitware.mummy.Runtime.dll和Kitware.VTK.dll

image

image

private void button1_Click(object sender, EventArgs e)
{
// Managed Code
double[] lineP0 = new double[3] { 4.0, 0.0, 0.0 };
double[] lineP1 = new double[3] { 2.0, 0.0, 0.0 };
double[] P0 = new double[3] { 1.0, 0.0, 0.0 };
double[] P1 = new double[3] { 1.0, 2.0, 0.0 };

// Unmanaged Code
IntPtr pP0 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
IntPtr pP1 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
IntPtr pLineP0 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
IntPtr pLineP1 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);

// Don't worry, fortunately only a few functions in ActiViz.NET need
// Marshaling between Managed and Unmanaged Code
Marshal.Copy(P0, 0, pP0, 3);
Marshal.Copy(P1, 0, pP1, 3);
Marshal.Copy(lineP0, 0, pLineP0, 3);
Marshal.Copy(lineP1, 0, pLineP1, 3);
double dist0 = vtkLine.DistanceToLine(pP0, pLineP0, pLineP1);
double dist1 = vtkLine.DistanceToLine(pP1, pLineP0, pLineP1);
label3.Text = dist0.ToString();
label4.Text = dist1.ToString();

double parametricCoord = 0.0; // must be initialized because this var is passed by reference
double[] closest = new double[3];
IntPtr pClosest = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
Marshal.Copy(closest, 0, pClosest, 3);

dist0 = vtkLine.DistanceToLine(pP0, pLineP0, pLineP1, ref parametricCoord, pClosest);
Marshal.Copy(pClosest, closest, 0, 3);
label6.Text = string.Format("Dist0: {0} closest point: {1},{2},{3}", dist0, closest[0], closest[1], closest[2]);

dist1 = vtkLine.DistanceToLine(pP1, pLineP0, pLineP1, ref parametricCoord, pClosest);
Marshal.Copy(pClosest, closest, 0, 3);
label8.Text = string.Format("Dist1: {0} closest point: {1},{2},{3}", dist1, closest[0], closest[1], closest[2]);

Marshal.FreeHGlobal(pP0);
Marshal.FreeHGlobal(pP1);
Marshal.FreeHGlobal(pLineP0);
Marshal.FreeHGlobal(pLineP1);
Marshal.FreeHGlobal(pClosest);
}


======================================================

image

image

參考資料:

1. VTK/Examples/Cxx/SimpleOperations/DistancePointToLine

arrow
arrow
    全站熱搜

    me1237guy 發表在 痞客邦 留言(0) 人氣()