Здравствуйте, <Аноним>, Вы писали:
А> Как с помощью CPaintDC нарисовать эллипс, повернутый на любой угол,
А>если известны его диагонали?
Если юзать GDI+, то там все просто — берем эллипс и поворачиваем его на нужный угол:
Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.RotateTransform(28.0f);
graphics.DrawEllipse(&pen, rect);
... << RSDN@Home 1.1 beta 2 >>
Здравствуйте, Аноним, Вы писали:
А> Как с помощью CPaintDC нарисовать эллипс, повернутый на любой угол,
А>если известны его диагонали?
Элементарно:
//число пи
#define M_PI 3.1415926535897932384626433832795028841971693993751058209
//перевод из угла в радианы
#define TO_RAD(angle) (((angle)*M_PI)/180.0)
// поворот точки pX pY вокруг точки centerX centerY на угол angle (в радианах)
void RotatePoint(DOUBLE* pX, DOUBLE* pY, DOUBLE angle, DOUBLE centerX, DOUBLE centerY)
{
DOUBLE x, y;
DOUBLE s, c;
x=*pX-centerX;
y=*pY-centerY;
s=sin(angle);
c=cos(angle);
*pX=x*c-y*s+centerX;
*pY=x*s+y*c+centerY;
}
// A и B диагонали, centerX и centerY - центр эллипса, rotAng - угол поворота в градусах
void DrawEllipse(CDC* pDC, DOUBLE A, DOUBLE B, DOUBLE centerX, DOUBLE centerY, DOUBLE rotAng)
{
DOUBLE x=A, y=0;
DOUBLE nextX, nextY;
DOUBLE sigma;
sigma=TO_RAD(2);// шаг 2 градуса
INT N;
N=2*M_PI/sigma;// количество апроксимирующих отрезков
DOUBLE cosSigma=cos(sigma);
DOUBLE sinSigme=sin(sigma);
DOUBLE tempX, tempY;
DOUBLE AB;
AB=A/B;
for(INT a=0;a<N;a++)
{
nextX=x*cosSigma-AB*y*sinSigme;
nextY=1/AB*x*sinSigme+y*cosSigma;
tempX=nextX;
tempY=nextY;
RotatePoint(&x, &y, TO_RAD(rotAng), centerX, centerY);
RotatePoint(&nextX, &nextY, TO_RAD(rotAng), centerX, centerY);
pDC->MoveTo(x, y);
pDC->LineTo(nextX, nextY);
x=tempX;
y=tempY;
}
}