Повернутый эллипс
От: Аноним  
Дата: 20.10.03 10:34
Оценка:
Как с помощью CPaintDC нарисовать эллипс, повернутый на любой угол,
если известны его диагонали?
Re: Повернутый эллипс
От: Кирпа В.А. Украина  
Дата: 20.10.03 12:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Как с помощью CPaintDC нарисовать эллипс, повернутый на любой угол,

А>если известны его диагонали?

Копай в сторону траекторий и афинных преобразований

CDC::BeginPath(), CDC::EndPath(), CDC::GetPath(), CDC::FlattenPath()
!0xDEAD
Re: Повернутый эллипс
От: HeaveN Россия  
Дата: 20.10.03 12:22
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> Как с помощью 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 >>
Нет такого закона, что человеку летать нельзя...
Re: Повернутый эллипс
От: Alex Ivakin  
Дата: 20.10.03 19:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Как с помощью 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;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.