33 #include <visp3/ustk_needle_modeling/usNeedleModelingDisplayTools.h>
35 #include <visp3/core/vpDisplay.h>
36 #include <visp3/core/vpImage.h>
37 #include <visp3/core/vpRGBa.h>
39 #include <visp3/ustk_core/usGeometryTools.h>
46 template <
class ImageDataType>
48 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
53 const vpHomogeneousMatrix &,
double,
double);
55 const vpHomogeneousMatrix &,
double,
double);
57 template <
class ImageDataType>
59 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
64 const vpHomogeneousMatrix &,
double,
double);
66 const vpHomogeneousMatrix &,
double,
double);
68 template <
class ImageDataType>
70 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
72 displayBase(needleModel, I, imageMworld, Xscale, Yscale);
73 displayTip(needleModel, I, imageMworld, Xscale, Yscale);
76 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale);
78 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale);
82 template <
class ImageDataType>
84 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
88 if (displayFullBody) {
92 vpColVector z(imageMworld.inverse().getCol(2), 0, 3);
94 std::vector<double> params(11);
95 std::vector<vpColVector> p1(11);
96 std::vector<vpColVector> p2(11);
97 for (
int i = 0; i < 11; i++) {
98 params.at(i) = i * step;
99 vpColVector p(needleModel.
getPoint(params.at(i)));
100 vpColVector x(vpColVector::crossProd(needleModel.
getTangent(params.at(i)), z).normalize());
101 p1.at(i) = p + r * x;
102 p2.at(i) = p - r * x;
105 vpColVector x(vpColVector::crossProd(needleModel.
getEndTangent(), z).normalize());
106 p1.back() = p + r * x;
107 p2.back() = p - r * x;
117 const vpHomogeneousMatrix &,
double,
double,
bool);
119 const vpHomogeneousMatrix &,
double,
double,
bool);
121 template <
class ImageDataType>
123 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
125 vpRotationMatrix R(imageMworld);
126 vpTranslationVector T(imageMworld);
129 vpColVector worldForce(worldTorsor, 0, 3);
130 vpColVector worldMoment(worldTorsor, 3, 3);
132 vpColVector imageBase = R * needleModel.
getStartPoint() + vpColVector(T);
133 vpColVector imageForce = R * worldForce;
134 vpColVector imageMoment = R * worldMoment;
136 double x = Xscale * imageBase[0];
137 double y = Yscale * imageBase[1];
139 double force_x = imageForce[0];
140 double force_y = imageForce[1];
142 double moment_x = imageMoment[0];
143 double moment_y = imageMoment[1];
145 vpDisplay::displayArrow(I, y, x, y + 100 * force_y, x + 100 * force_x, vpColor::red, 5, 5, 3);
146 vpDisplay::displayArrow(I, y, x, y + 3000 * moment_y, x + 3000 * moment_x, vpColor::green, 5, 5, 3);
149 const vpImage<unsigned char> &,
150 const vpHomogeneousMatrix &,
double,
double);
152 const vpHomogeneousMatrix &,
double,
double);
154 template <
class ImageDataType>
156 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
161 const vpImage<unsigned char> &,
162 const vpHomogeneousMatrix &,
double,
double);
164 const vpHomogeneousMatrix &,
double,
double);
166 template <
class ImageDataType>
168 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
170 displayNeedle(needleModel, I, imageMworld, Xscale, Yscale, displayFullBody);
175 const vpHomogeneousMatrix &,
double,
double,
bool);
177 const vpHomogeneousMatrix &,
double,
double,
bool);
181 template <
class ImageDataType>
183 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
186 if (displayFullBody) {
188 vpColVector z(imageMworld.inverse().getCol(2), 0, 3);
191 std::vector<vpColVector> p1(needleModel.
getNbSegments() + 1);
192 std::vector<vpColVector> p2(needleModel.
getNbSegments() + 1);
197 p1.at(i) = p + r * x;
198 p2.at(i) = p - r * x;
202 p1.back() = p + r * x;
203 p2.back() = p - r * x;
215 const vpHomogeneousMatrix &,
double,
double,
bool);
217 const vpHomogeneousMatrix &,
double,
double,
bool);
219 template <
class ImageDataType>
221 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
223 vpRotationMatrix R(imageMworld);
224 vpTranslationVector T(imageMworld);
227 vpColVector worldForce(worldTorsor, 0, 3);
228 vpColVector worldMoment(worldTorsor, 3, 3);
231 vpColVector imageForce = R * worldForce;
232 vpColVector imageMoment = R * worldMoment;
234 double x = Xscale * imageBase[0];
235 double y = Yscale * imageBase[1];
237 double force_x = imageForce[0];
238 double force_y = imageForce[1];
240 double moment_x = imageMoment[0];
241 double moment_y = imageMoment[1];
243 vpDisplay::displayArrow(I, y, x, y + 100 * force_y, x + 100 * force_x, vpColor::red, 5, 5, 3);
244 vpDisplay::displayArrow(I, y, x, y + 3000 * moment_y, x + 3000 * moment_x, vpColor::green, 5, 5, 3);
247 const vpImage<unsigned char> &,
248 const vpHomogeneousMatrix &,
double,
double);
250 const vpImage<vpRGBa> &,
const vpHomogeneousMatrix &,
double,
253 template <
class ImageDataType>
255 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
260 const vpImage<unsigned char> &,
261 const vpHomogeneousMatrix &,
double,
double);
263 const vpHomogeneousMatrix &,
double,
double);
265 template <
class ImageDataType>
267 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
269 displayNeedle(needleModel, I, imageMworld, Xscale, Yscale, displayFullBody);
274 const vpHomogeneousMatrix &,
double,
double,
bool);
276 const vpHomogeneousMatrix &,
double,
double,
bool);
280 template <
class ImageType>
282 double Xscale,
double Yscale)
287 const vpHomogeneousMatrix &,
double,
double);
293 template <
class ImageDataType>
295 double Xscale,
double Yscale)
301 const vpHomogeneousMatrix &,
double,
double);
303 const vpHomogeneousMatrix &,
double,
double);
307 template <
class ImageDataType>
308 void display(
const usNeedleTip &tip,
const vpImage<ImageDataType> &I,
const vpHomogeneousMatrix &imageMworld,
309 double Xscale,
double Yscale)
314 const vpHomogeneousMatrix &,
double,
double);
320 template <
class ImageDataType>
322 double Xscale,
double Yscale)
324 vpRotationMatrix R(imageMworld);
325 vpTranslationVector T(imageMworld);
331 vpColVector imageB(R * b + T);
332 vpColVector imageT(R * t + T);
333 vpColVector imageD(R * d);
344 x[0] = Xscale * (imageT[0]);
345 y[0] = Yscale * (imageT[1]);
347 x[1] = Xscale * (imageB[0] + diameter / 2 * n[0]);
348 y[1] = Yscale * (imageB[1] + diameter / 2 * n[1]);
350 x[2] = Xscale * (imageB[0] - diameter / 2 * n[0]);
351 y[2] = Yscale * (imageB[1] - diameter / 2 * n[1]);
353 for (
int i = 0; i < 3; i++) {
354 vpDisplay::displayLine(I, y[i], x[i], y[(i + 1) % 3], x[(i + 1) % 3], vpColor::red);
358 const vpHomogeneousMatrix &,
double,
double);
360 const vpHomogeneousMatrix &,
double,
double);
364 template <
class ImageDataType>
366 double Xscale,
double Yscale)
368 vpRotationMatrix R(imageMworld);
369 vpTranslationVector T(imageMworld);
375 vpColVector imageB(R * b + T);
376 vpColVector imageDy(R * dy);
377 vpColVector imageDz(R * dz);
385 x[0] = Xscale * (imageB[0] + diameter / 2 * imageDy[0]);
386 y[0] = Yscale * (imageB[1] + diameter / 2 * imageDy[1]);
388 x[1] = Xscale * (imageB[0] - diameter / 2 * imageDy[0]);
389 y[1] = Yscale * (imageB[1] - diameter / 2 * imageDy[1]);
391 x[2] = Xscale * (imageB[0] + diameter / 2 * imageDy[0] + length * imageDz[0]);
392 y[2] = Yscale * (imageB[1] + diameter / 2 * imageDy[1] + length * imageDz[1]);
394 for (
int i = 0; i < 3; i++) {
395 vpDisplay::displayLine(I, y[i], x[i], y[(i + 1) % 3], x[(i + 1) % 3], vpColor::red);
399 const vpHomogeneousMatrix &,
double,
double);
401 const vpHomogeneousMatrix &,
double,
double);
405 template <
class ImageDataType>
407 double Xscale,
double Yscale)
409 vpRotationMatrix R(imageMworld);
410 vpTranslationVector T(imageMworld);
416 vpColVector imageB(R * b + T);
417 vpColVector imageT(R * t + T);
418 vpColVector imageD(R * d);
429 x[0] = Xscale * (imageT[0]);
430 y[0] = Yscale * (imageT[1]);
432 x[1] = Xscale * (imageB[0] + diameter / 2 * n[0]);
433 y[1] = Yscale * (imageB[1] + diameter / 2 * n[1]);
435 x[2] = Xscale * (imageB[0] - diameter / 2 * n[0]);
436 y[2] = Yscale * (imageB[1] - diameter / 2 * n[1]);
438 for (
int i = 0; i < 3; i++) {
439 vpDisplay::displayLine(I, y[i], x[i], y[(i + 1) % 3], x[(i + 1) % 3], vpColor::red);
443 const vpHomogeneousMatrix &,
double,
double);
445 const vpHomogeneousMatrix &,
double,
double);
449 template <
class ImageDataType>
451 double Xscale,
double Yscale)
453 vpRotationMatrix R(imageMworld);
454 vpTranslationVector T(imageMworld);
459 vpColVector imageB(R * b + T);
460 vpColVector imageD(R * d);
472 x[0] = Xscale * (imageB[0] + length * imageD[0]);
473 y[0] = Yscale * (imageB[1] + length * imageD[1]);
475 x[1] = Xscale * (imageB[0] + diameter / 2 * n[0]);
476 y[1] = Yscale * (imageB[1] + diameter / 2 * n[1]);
478 x[2] = Xscale * (imageB[0] - diameter / 2 * n[0]);
479 y[2] = Yscale * (imageB[1] - diameter / 2 * n[1]);
481 for (
int i = 0; i < 3; i++) {
482 vpDisplay::displayLine(I, y[i], x[i], y[(i + 1) % 3], x[(i + 1) % 3], vpColor::red);
486 const vpHomogeneousMatrix &,
double,
double);
488 const vpHomogeneousMatrix &,
double,
double);
492 template <
class ImageDataType>
494 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
499 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
double,
502 const vpHomogeneousMatrix &,
double,
double);
506 template <
class ImageDataType>
508 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
515 double restIndex = 0;
525 double restParam = nextLayerLength - l;
549 const vpImage<unsigned char> &,
550 const vpHomogeneousMatrix &,
double,
double);
552 const vpImage<vpRGBa> &,
const vpHomogeneousMatrix &,
double,
555 template <
class ImageDataType>
557 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
564 if (freeLength >= length)
567 vpRotationMatrix R(imageMworld);
568 vpTranslationVector T(imageMworld);
570 vpColVector worldPoint(3);
571 vpColVector worldRestPoint(3);
572 vpColVector imagePoint(3);
573 vpColVector imageRestPoint(3);
575 for (
int i = 0; i < 10; i++) {
576 double l = freeLength + (length - freeLength) * (i / 9.0);
579 double restParam = 0;
586 imagePoint = R * worldPoint + T;
587 imageRestPoint = R * worldRestPoint + T;
589 double x = Xscale * imagePoint[0];
590 double y = Yscale * imagePoint[1];
592 double xr = Xscale * imageRestPoint[0];
593 double yr = Yscale * imageRestPoint[1];
595 vpDisplay::displayArrow(I, y, x, yr, xr, vpColor::black);
599 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
602 const vpImage<vpRGBa> &,
const vpHomogeneousMatrix &,
double,
605 template <
class ImageDataType>
607 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
633 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
double,
636 const vpHomogeneousMatrix &,
double,
double,
bool);
640 template <
class ImageDataType>
642 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
658 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
double,
661 const vpHomogeneousMatrix &,
double,
double,
bool);
const usPolynomialCurve3D & accessSegment(int i) const
int getNbSegments() const
Parameters setters and getters.
const usPolynomialCurve3D & accessLastSegment() const
vpColVector getPoint(double param) const
Measure curve information.
void defineFromPoints(const std::vector< vpColVector > &points, const std::vector< double > &lengths, int order=3)
const usNeedleModelBaseTip & accessNeedle() const
Needle.
NeedleTipType getNeedleTipType() const
usNeedleTip const & accessNeedleTip() const
double getNeedleFreeLength(int *seg=nullptr, double *param=nullptr) const
const usTissueModelSpline & accessTissue() const
Tissue parameters.
double getLayerLength(int i) const
const usNeedleModelSpline & accessNeedle() const
Parameters setters and getters.
bool getCorrespondingPathPoint(double l, int &correspondingRestIndex, double &correspondingRestParam) const
const usVirtualSpring & accessSpring(int i) const
const usOrientedPlane3D & accessSurface() const
Tissue.
const usNeedleModelSpline & accessNeedle() const
Model parameters.
vpHomogeneousMatrix getWorldMtip() const
vpHomogeneousMatrix getWorldMbase() const
vpColVector getBaseStaticTorsor() const
Force at base.
double getOuterDiameter() const
double getFullLength() const
vpColVector getBaseStaticTorsor() const
Force at base.
double getOuterDiameter() const
double getDiameter() const
double getDiameter() const
double getDiameter() const
double getDiameter() const
vpHomogeneousMatrix getWorldMbase() const
vpColVector getTipPosition() const
vpColVector getBasePosition() const
vpColVector getBaseAxisZ() const
vpColVector getBaseAxisY() const
vpColVector getDirection() const
vpColVector getPosition() const
void defineFromPoints(const std::vector< vpColVector > &points, const std::vector< double > ¶m, unsigned int order=0)
vpColVector getStartTangent() const
vpColVector getTangent(double parameter) const
unsigned int getOrder() const
vpColVector getPoint(double parameter) const
vpColVector getEndPoint() const
vpColVector getEndTangent() const
double getParametricLength() const
vpColVector getStartPoint() const
const usBSpline3D & accessPath() const
const usOrientedPlane3D & accessSurface() const
Parameters setters and getters.
bool IsPositionUpdateAllowed() const