18 #ifndef __otbVectorDataToRightAngleVectorDataFilter_txx
19 #define __otbVectorDataToRightAngleVectorDataFilter_txx
26 template <
class TVectorData>
30 this->SetNumberOfRequiredInputs(1);
31 this->SetNumberOfRequiredOutputs(1);
33 m_DistanceThreshold = 20.;
37 template <
class TVectorData>
43 typename VectorDataType::Pointer vData =
const_cast<VectorDataType *
>(this->GetInput());
46 this->GetOutput(0)->SetMetaDataDictionary(vData->GetMetaDataDictionary());
49 typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get();
51 typename DataNodeType::Pointer document = DataNodeType::New();
54 this->GetOutput(0)->GetDataTree()->Add(document, root);
56 typename DataNodeType::Pointer folder = DataNodeType::New();
58 this->GetOutput(0)->GetDataTree()->Add(folder, document);
59 this->GetOutput(0)->SetProjectionRef(vData->GetProjectionRef());
65 while (!itVectorRef.IsAtEnd())
67 if (!itVectorRef.Get()->IsLineFeature())
76 if (!itVectorCur.
Get()->IsLineFeature())
82 double Angle = this->ComputeAngleFormedBySegments(itVectorRef.Get()->GetLine(),
83 itVectorCur.
Get()->GetLine());
86 if (vcl_abs(Angle -
CONST_PI_2) <= m_AngleThreshold)
90 RightAngleCoordinate = this->ComputeRightAngleCoordinate(itVectorRef.Get()->GetLine(),
91 itVectorCur.
Get()->GetLine());
94 double dist1_2 = this->ComputeDistanceFromPointToSegment(RightAngleCoordinate,
95 itVectorRef.Get()->GetLine());
96 double dist2_2 = this->ComputeDistanceFromPointToSegment(RightAngleCoordinate,
97 itVectorCur.
Get()->GetLine());
99 double threshold_2 = m_DistanceThreshold * m_DistanceThreshold;
100 if (dist1_2 < threshold_2 && dist2_2 < threshold_2)
103 typename DataNodeType::Pointer CurrentGeometry = DataNodeType::New();
104 CurrentGeometry->SetNodeId(
"FEATURE_POINT");
106 CurrentGeometry->SetPoint(RightAngleCoordinate);
107 this->GetOutput(0)->GetDataTree()->Add(CurrentGeometry, folder);
117 template <
class TVectorData>
128 double l2 = v0.SquaredEuclideanDistanceTo(v1);
132 double u = ((rAngle[0] - v0[0]) *(v1[0] - v0[0] ) +
133 (rAngle[1] - v0[1]) *(v1[1] - v0[1])) / l2;
135 if( u < 1e-10 ) u = 0.;
136 if( u -1. > 1e-10 ) u = 1.;
138 double x = v0[0] + u *(v1[0] - v0[0] );
139 double y = v0[1] + u *(v1[1] - v0[1] );
141 double dx = x - rAngle[0];
142 double dy = y - rAngle[1];
144 return dx*dx + dy*dy;
147 template <
class TVectorData>
152 double oriDst = this->ComputeOrientation(lineDst);
153 double oriSrc = this->ComputeOrientation(lineSrc);
155 return vcl_abs(oriDst - oriSrc);
158 template <
class TVectorData>
165 double Xp1 = vertexList->GetElement(0)[0];
166 double Yp1 = vertexList->GetElement(0)[1];
168 double Xp2 = vertexList->GetElement(1)[0];
169 double Yp2 = vertexList->GetElement(1)[1];
172 double dx = Xp1 - Xp2;
173 double dy = Yp1 - Yp2;
174 double orientation = vcl_atan2(dy, dx);
175 if (orientation < 0) orientation +=
CONST_PI;
180 template <
class TVectorData>
189 double Xp1 = vertexListSrc->GetElement(0)[0];
190 double Yp1 = vertexListSrc->GetElement(0)[1];
191 double Xp2 = vertexListSrc->GetElement(1)[0];
192 double Yp2 = vertexListSrc->GetElement(1)[1];
195 double Xq1 = vertexListDst->GetElement(0)[0];
196 double Yq1 = vertexListDst->GetElement(0)[1];
197 double Xq2 = vertexListDst->GetElement(1)[0];
198 double Yq2 = vertexListDst->GetElement(1)[1];
200 double numU = (Xq2 - Xq1)*(Yp1-Yq1) - (Yq2-Yq1)*(Xp1-Xq1);
201 double denumU = (Yq2-Yq1)*(Xp2-Xp1)-(Xq2-Xq1)*(Yp2-Yp1);
203 double u = numU/ denumU;
205 P[0] = Xp1 + u*(Xp2-Xp1);
206 P[1] = Yp1 + u * (Yp2-Yp1);
211 template <
class TVectorData>
216 Superclass::PrintSelf(os, indent);