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);
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;
548 const vpImage<unsigned char> &,
549 const vpHomogeneousMatrix &,
double,
double);
551 const vpImage<vpRGBa> &,
const vpHomogeneousMatrix &,
double,
554 template <
class ImageDataType>
556 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale)
563 if (freeLength >= length)
566 vpRotationMatrix R(imageMworld);
567 vpTranslationVector T(imageMworld);
569 vpColVector worldPoint(3);
570 vpColVector worldRestPoint(3);
571 vpColVector imagePoint(3);
572 vpColVector imageRestPoint(3);
574 for (
int i = 0; i < 10; i++) {
575 double l = freeLength + (length - freeLength) * (i / 9.0);
578 double restParam = 0;
585 imagePoint = R * worldPoint + T;
586 imageRestPoint = R * worldRestPoint + T;
588 double x = Xscale * imagePoint[0];
589 double y = Yscale * imagePoint[1];
591 double xr = Xscale * imageRestPoint[0];
592 double yr = Yscale * imageRestPoint[1];
594 vpDisplay::displayArrow(I, y, x, yr, xr, vpColor::black);
598 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
601 const vpImage<vpRGBa> &,
const vpHomogeneousMatrix &,
double,
604 template <
class ImageDataType>
606 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
632 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
double,
635 const vpHomogeneousMatrix &,
double,
double,
bool);
639 template <
class ImageDataType>
641 const vpHomogeneousMatrix &imageMworld,
double Xscale,
double Yscale,
bool displayFullBody)
657 const vpImage<unsigned char> &,
const vpHomogeneousMatrix &,
double,
660 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