S
ich zeichne Kreisbögen so. wenn xRadius und yRadius sowie DegreeBegin und DegreeEnd entsprechend gesetzt sind, zeichnet das nen Ellipse (oder Kreis, wenn die Radii übereinstimmen). Phi gibt den Rotationswinkel an. Kreise selber zeichne ich in eine Extrafunktion mittels Bresenham.
//---------------------------------------------------------------------------
// Funktion zeichnet einen Kreisbogen.
// -> 'X' und 'Y' bilden den Mittelpunkt
// -> 'RadiusX' und 'RadiusY' legen den Radius in x- bzw. y-Richtung fest
// -> 'Phi' bestimmt den Winkel um den der Kreisbogen gedreht werden soll
// -> 'Color' ist ein RGB-Triple
// -> 'Opacity' Deckungsgrad
//---------------------------------------------------------------------------
template <typename T>
void Image<T>::DrawArc(int xCenter, int yCenter, const double xRadius, const double yRadius, const double Phi, const int DegreeBegin, const int DegreeEnd, const T &Color, const float Opacity)
{
int LastX = 0;
int LastY = 0;
bool Closed = aiLibMath::Abs(DegreeEnd - DegreeBegin) == 360; // Tortenstücke zeichnen
double SinPhi = aiLibMath::Sin(Phi);
double CosPhi = aiLibMath::Cos(Phi);
double SinPos;
double CosPos;
int NextX;
int NextY;
double Pos;
// Kreisbogen zwischen 'DegreeBegin' und 'DegreeEnd' zeichnen
for (int i = DegreeBegin; i <= DegreeEnd; ++i)
{
// Schrittweite pro Punkt
Pos = aiLibMath::DegreeToArc(i);
SinPos = aiLibMath::Sin(Pos) * yRadius;
CosPos = aiLibMath::Cos(Pos) * xRadius;
// neue x und y Koordinaten berechnen und zusaetzlich um 'Phi' drehen
NextX = aiLibMath::Round(xCenter + (CosPos * CosPhi) + (SinPos * SinPhi));
NextY = aiLibMath::Round(yCenter - (SinPos * CosPhi) + (CosPos * SinPhi));
// ist Position innerhalb des Bildes?
if (!InRange(NextX, 0, (int) this->xDim) || !InRange(NextY, 0, (int) this->yDim)) continue;
if (!InRange(LastX, 0, (int) this->xDim) || !InRange(LastY, 0, (int) this->yDim)) continue;
if ((i == DegreeBegin) && !Closed)
DrawLine(xCenter, yCenter, NextX, NextY, Color, Opacity);
// Linie zum Zielpunkt zeichnen
if (i != DegreeBegin)
DrawLine(LastX, LastY, NextX, NextY, Color, Opacity);
LastX = NextX;
LastY = NextY;
}
if (!Closed)
DrawLine(xCenter, yCenter, LastX, LastY, Color, Opacity);
}