DGtal 1.4.0
Loading...
Searching...
No Matches
DGtal::FrechetShortcut< TIterator, TInteger >::Tools Struct Reference

#include <DGtal/geometry/curves/FrechetShortcut.h>

Static Public Member Functions

static bool isBetween (double i, double a, double b, double n)
 
static int circle_circle_intersection (double x0, double y0, double r0, double x1, double y1, double r1, double *xi, double *yi, double *xi_prime, double *yi_prime)
 
static int circleTangentPoints (double x, double y, double x1, double y1, double r1, double *xi, double *yi, double *xi_prime, double *yi_prime)
 
static double computeAngle (double x0, double y0, double x1, double y1)
 
static double angleVectVect (Vector u, Vector v)
 
static int computeChainCode (Point p, Point q)
 
static int computeOctant (Point p, Point q)
 
static int rot (int d, int quad)
 
static Vector chainCode2Vect (int d)
 

Detailed Description

template<typename TIterator, typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
struct DGtal::FrechetShortcut< TIterator, TInteger >::Tools

Definition at line 354 of file FrechetShortcut.h.

Member Function Documentation

◆ angleVectVect()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static double DGtal::FrechetShortcut< TIterator, TInteger >::Tools::angleVectVect ( Vector u,
Vector v )
inlinestatic

Angle between two vectors

Parameters
uand
vtwo vectors
Returns
an angle

Definition at line 578 of file FrechetShortcut.h.

579 {
580 IntegerComputer<Integer> ic;
581 return acos((double)ic.dotProduct(u,v)/(u.norm()*v.norm()));
582 }

References DGtal::IntegerComputer< TInteger >::dotProduct().

◆ chainCode2Vect()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static Vector DGtal::FrechetShortcut< TIterator, TInteger >::Tools::chainCode2Vect ( int d)
inlinestatic

Converts a chain code into a vector

Parameters
dan int
Returns
a vector

Definition at line 689 of file FrechetShortcut.h.

690 {
691 Vector v;
692 switch(d){
693
694 case 0:{
695 v[0] = 1;
696 v[1] = 0;
697 break;
698 }
699 case 1:{
700 v[0] = 1;
701 v[1] = 1;
702 break;
703 }
704 case 2:{
705 v[0] = 0;
706 v[1] = 1;
707 break;
708 }
709 case 3:{
710 v[0] = -1;
711 v[1] = 1;
712 break;
713 }
714 case 4:{
715 v[0] = -1;
716 v[1] = 0;
717 break;
718 }
719 case 5:{
720 v[0] = -1;
721 v[1] = -1;
722 break;
723 }
724 case 6:{
725 v[0] = 0;
726 v[1] = -1;
727 break;
728 }
729 case 7:{
730 v[0] = 1;
731 v[1] = -1;
732 break;
733 }
734
735 }
736
737 return v;
738 }
DigitalPlane::Point Vector

◆ circle_circle_intersection()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static int DGtal::FrechetShortcut< TIterator, TInteger >::Tools::circle_circle_intersection ( double x0,
double y0,
double r0,
double x1,
double y1,
double r1,
double * xi,
double * yi,
double * xi_prime,
double * yi_prime )
inlinestatic

Determine the points where two circles in a common plane intersect Parameters: three doubles per circle (center, radius), pointers to the two intersection points

Returns
0 if the circles do not intersect each other, 1 otherwise

Definition at line 400 of file FrechetShortcut.h.

404 {
405 // I. Sivignon 05/2024: fix to handle the case where r0=0 or
406 // r1=0. Enables the case where error=0.
407 // Other special cases where circles are tangent are treated
408 // below.
409 if(r0==0)
410 {
411 *xi = x0; *yi = y0;
412 *xi_prime = x0 ; *yi_prime = y0;
413 return 1;
414 }
415 else
416 if(r1==0)
417 {
418 *xi = x1; *yi = y1;
419 *xi_prime = x1 ; *yi_prime = y1;
420 return 1;
421 }
422
423 double a, dx, dy, d, h, rx, ry;
424 double x2, y2;
425
426 /* dx and dy are the vertical and horizontal distances between
427 * the circle centers.
428 */
429 dx = x1 - x0;
430 dy = y1 - y0;
431
432 /* Determine the straight-line distance between the centers. */
433 //d = sqrt((dy*dy) + (dx*dx));
434 d = hypot(dx,dy); // Suggested by Keith Briggs
435
436 if((r0+r1)*(r0+r1)-((dy*dy)+(dx*dx)) < PRECISION)
437 { // I. Sivignon 05/2024: fix to handle the case where
438 // circles are tangent but radii are non zero.
439
440 double alpha= r0/d;
441 *xi = x0 + dx*alpha;
442 *yi = y0 + dy*alpha;
443 *xi_prime = *xi; *yi_prime = *yi;
444 return 1;
445 }
446
447 /* Check for solvability. */
448 if (d > (r0 + r1))
449 {
450 /* no solution. circles do not intersect. */
451 std::cerr << "Warning : the two circles do not intersect -> should never happen" << std::endl;
452 return 0; //I. Sivignon 05/2010 should never happen for our specific use.
453 }
454 if (d < fabs(r0 - r1))
455 {
456 /* no solution. one circle is contained in the other */
457 return 0;
458 }
459
460 // }
461 /* 'point 2' is the point where the line through the circle
462 * intersection points crosses the line between the circle
463 * centers.
464 */
465
466 /* Determine the distance from point 0 to point 2. */
467 a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;
468
469 /* Determine the coordinates of point 2. */
470 x2 = x0 + (dx * a/d);
471 y2 = y0 + (dy * a/d);
472
473
474 /* Determine the distance from point 2 to either of the
475 * intersection points.
476 */
477 h = sqrt((r0*r0) - (a*a));
478
479 /* Now determine the offsets of the intersection points from
480 * point 2.
481 */
482 rx = -dy * (h/d);
483 ry = dx * (h/d);
484
485 /* Determine the absolute intersection points. */
486 *xi = x2 + rx;
487 *xi_prime = x2 - rx;
488 *yi = y2 + ry;
489 *yi_prime = y2 - ry;
490
491 return 1;
492 }

Referenced by DGtal::FrechetShortcut< TIterator, TInteger >::Tools::circleTangentPoints().

◆ circleTangentPoints()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static int DGtal::FrechetShortcut< TIterator, TInteger >::Tools::circleTangentPoints ( double x,
double y,
double x1,
double y1,
double r1,
double * xi,
double * yi,
double * xi_prime,
double * yi_prime )
inlinestatic

Given a point X and a circle of center X1, compute the two points Xi and Xi' of the circle the tangent of which go through X. Since the triangle XXiX1 is a right triangle on Xi, the middle point M between X and X1 is equidistant to X, X1 and Xi. Thus, Xi belongs to the intersection of the circle (X1,r1) and the circle of center M and radius ||XX1||/2.

Parameters
[in]xthe first coordinate of X.
[in]ythe second coordinate of X.
[in]x1the first coordinate of the circle center X1.
[in]y1the second coordinate of the circle center X1.
[in]r1the circle radius.
[out]xipointer to the first coordinate of the first intersection point.
[out]yipointer to the second coordinate of the first intersection point.
[out]xi_primepointer to the first coordinate of the second intersection point.
[out]yi_primepointer to the second coordinate of the second intersection point.
Returns
result of the call to circle_circle_intersection

Definition at line 515 of file FrechetShortcut.h.

517 {
518 double x0 = (x+x1)/2;
519 double y0 = (y+y1)/2;
520 double r0 = sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1))/2;
521
522 int res =
523 circle_circle_intersection(x0,y0,r0,x1,y1,r1,xi,yi,xi_prime,yi_prime);
524
525
526 return res;
527
528 }
static int circle_circle_intersection(double x0, double y0, double r0, double x1, double y1, double r1, double *xi, double *yi, double *xi_prime, double *yi_prime)

References DGtal::FrechetShortcut< TIterator, TInteger >::Tools::circle_circle_intersection().

◆ computeAngle()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static double DGtal::FrechetShortcut< TIterator, TInteger >::Tools::computeAngle ( double x0,
double y0,
double x1,
double y1 )
inlinestatic

Compute the angle of the line passing through two points. Angle in [0,2pi]

Parameters
x0x0
y0y0
x1x1
y1y1
Returns
an angle

Definition at line 540 of file FrechetShortcut.h.

541 {
542 double x = x1-x0;
543 double y = y1-y0;
544
545 if(x!=0)
546 {
547 double alpha = y/x;
548
549 if(x>0 && y>=0)
550 return atan(alpha);
551 else
552 if(x>0 && y<0)
553 return atan(alpha)+2*M_PI;
554 else
555 if(x<0)
556 return atan(alpha)+M_PI;
557 }
558 else
559 {
560 if(y==0)
561 return 0;
562 else
563 if(y>0)
564 return M_PI_2;
565 else
566 return 3*M_PI_2;
567 }
568 return -1;
569 }

◆ computeChainCode()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static int DGtal::FrechetShortcut< TIterator, TInteger >::Tools::computeChainCode ( Point p,
Point q )
inlinestatic

Computes the chain code between two 8-connected pixels

Parameters
pand
qtwo points
Returns
an int

Definition at line 589 of file FrechetShortcut.h.

590 {
591 int d;
592 Coordinate x2 = q[0];
593 Coordinate y2 = q[1];
594 Coordinate x1 = p[0];
595 Coordinate y1 = p[1];
596
597 if(x2-x1==0)
598 if(y2-y1==1)
599 d=2;
600 else
601 d=6;
602 else
603 if(x2-x1==1)
604 if(y2-y1==0)
605 d=0;
606 else
607 if(y2-y1==1)
608 d=1;
609 else
610 d=7;
611 else
612 if(y2-y1==0)
613 d=4;
614 else
615 if(y2-y1==1)
616 d=3;
617 else
618 d=5;
619 return d;
620 }
Vector::Coordinate Coordinate

◆ computeOctant()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static int DGtal::FrechetShortcut< TIterator, TInteger >::Tools::computeOctant ( Point p,
Point q )
inlinestatic

Computes the octant of the direction pq

Parameters
pand
qtwo points
Returns
an int

Definition at line 627 of file FrechetShortcut.h.

628 {
629 int d = 0;
630 Coordinate x = q[0]-p[0];
631 Coordinate y = q[1]-p[1];
632
633 if(x>=0)
634 {
635 if(y>=0)
636 {
637 if(x>y)
638 d=0; // 0 <= y < x
639 else
640 if(x!=0)
641 d=1; // 0 <= x <= y
642 }
643 else
644 {
645 if(x>=abs(y))
646 d=7; // 0 < abs(y) <= x
647 else
648 d=6; // 0 <= x < abs(y)
649 }
650 }
651 if(x<=0)
652 {
653 if(y>0)
654 if(abs(x)>=y)
655 d=3; //
656 else
657 d=2;
658 else
659 {
660 if(abs(x)>abs(y))
661 d=4;
662 else
663 if(x!=0)
664 d=5;
665 }
666 }
667 return d;
668
669 }

◆ isBetween()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static bool DGtal::FrechetShortcut< TIterator, TInteger >::Tools::isBetween ( double i,
double a,
double b,
double n )
inlinestatic

Determines if i is between a and b in the oriented toric space modulo n

Parameters
ii
aa
bb
nn
Returns
true if i is between a anb d, false otherwise

Definition at line 365 of file FrechetShortcut.h.

366 {
367 if(a<=b)
368 return (i>=a && i<=b);
369 else
370 return ((i>=a && i<=n) || (i>=0 && i<=b));
371 }

◆ rot()

template<typename TIterator , typename TInteger = typename IteratorCirculatorTraits<TIterator>::Value::Coordinate>
static int DGtal::FrechetShortcut< TIterator, TInteger >::Tools::rot ( int d,
int quad )
inlinestatic

Rotate the chain code d to put it in the frame where the octant 'quad' is treated as the first octant.

Parameters
da chain code
quadthe octant
Returns
an int (the new chain code)

Definition at line 679 of file FrechetShortcut.h.

680 {
681 return (d-quad+8)%8;
682 }

The documentation for this struct was generated from the following file: