1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* @file Tools/ImageProcessing/BresenhamLineScan.cpp
* 
* Utility class which performs the Bresenham algorithm for line scanning
*
* @author <a href="mailto:timlaue@tzi.de">Tim Laue</a>
* @author <a href="mailto:walter.nistico@uni-dortmund.de">Walter Nistico</a>
* @author <a href="mailto:oberlies@sim.tu-darmstadt.de">Tobias Oberlies</a> (revised constructors and commenting) 
*/

#include "BresenhamLineScan.h"

#include "Tools/Math/Geometry.h"

BresenhamLineScan::BresenhamLineScan()<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  double dir = Math::pi_2;
  setup(dir);
}

BresenhamLineScan::BresenhamLineScan(const Vector2i& start, const Vector2i& end)<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  setup(start, end);
}

BresenhamLineScan::BresenhamLineScan(const Vector2d& direction)<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  setup(direction);
}

BresenhamLineScan::BresenhamLineScan(const double direction)<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  setup(direction);
}

BresenhamLineScan::BresenhamLineScan(const Vector2i& start, const Vector2d& direction, const unsigned int width, const unsigned int height)<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  setup(start, direction, width, height);
}

BresenhamLineScan::BresenhamLineScan(const Vector2i& start, const double direction, const unsigned int width, const unsigned int height)<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  setup(start, direction, width, height);
}

BresenhamLineScan::BresenhamLineScan(const Math::Line& line, const unsigned int width, const unsigned int height)<--- Member variable 'BresenhamLineScan::numberOfPixels' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::pixelCount' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::alongX' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::delta' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::baseError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::resetError' is not initialized in the constructor.<--- Member variable 'BresenhamLineScan::error' is not initialized in the constructor.
{
  setup(line, width, height);
}



void BresenhamLineScan::setup(const Vector2i& diff)
{
  int dx = diff.x;
  int dy = diff.y;
  int incX = ((dx>0) ? 1:-1);
  int incY = ((dy>0) ? 1:-1);
  int absDx(abs(dx));
  int absDy(abs(dy));
  alongX = (absDy < absDx);
  if(alongX)
  {
    baseError = -absDx;
    delta = 2*absDy;
    standardOffset.x = incX;
    standardOffset.y = 0;
    correctionOffset.x = 0;
    correctionOffset.y = incY;
    numberOfPixels = absDx;
  }
  else
  {
    baseError = -absDy;
    delta = 2*absDx;
    standardOffset.x = 0;
    standardOffset.y = incY;
    correctionOffset.x = incX;
    correctionOffset.y = 0;
    numberOfPixels = absDy;
  }
  resetError = 2*baseError;
  error = baseError;        //added, for lines != 45 degrees
  pixelCount = 0;
}//end setup

void BresenhamLineScan::setup(const Vector2i& start, const Vector2i& end)
{
  setup(end-start);
}

void BresenhamLineScan::setup(const double direction)
{
  setup(Vector2i(static_cast<int>(cos(direction)*1024.0), static_cast<int>(sin(direction)*1024.0)));
}

void BresenhamLineScan::setup(const Vector2d& direction)
{
  setup(Vector2i(static_cast<int>(direction.x*1024.0), static_cast<int>(direction.y*1024.0)));
}

void BresenhamLineScan::setup(const Vector2i& start, const double direction, const unsigned int width, const unsigned int height)
{
  // Create a line through the point start with the given direction
  Math::Line line(Pose2D(direction, start));

  setup(line, width, height);
}

void BresenhamLineScan::setup(const Vector2i& start, const Vector2d& direction, const unsigned int width, const unsigned int height)
{
  // Create a line through the point start with the given direction
  Math::Line line(start, direction);

  setup(line, width, height);
}

void BresenhamLineScan::setup(const Math::Line& line, const unsigned int width, const unsigned int height)
{
  Vector2i pointOne;
  Vector2i pointTwo;

  const Vector2i frameUpperLeft(0,0);
  const Vector2i frameLowerRight(width-1, height-1);
  Geometry::getIntersectionPointsOfLineAndRectangle(frameUpperLeft, frameLowerRight, line, pointOne, pointTwo);

  setup(pointTwo - line.getBase());
}//end setup