Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нарисовать линию со стрелкой на конце


Автор: specter50000 22.12.2007, 21:12
Всем доброго времени суток. Вот появилась необходимасть нарисовать
такую вещь. Ну если рисовать прямую там все более-менее понятно,
а вот как с дугой быть? Может кто чем поможет? Заранее спасибо!

Автор: jonie 22.12.2007, 22:27
Код

            const float ostrota = 0.25;
            const float ostrie = 20;
            float f1x2 , f1y2, f2x2, f2y2;
            float ugolstrelki = Math::Atan2( y2-y1 , x2-x1 );
            f1y2 = Math::Sin(ugolstrelki + ostrota + Math::PI )*ostrie + y2 + 100 ;
            f1x2 = Math::Cos(ugolstrelki + ostrota + Math::PI )*ostrie + x2 + 100 ;
            f2y2 = Math::Sin(ugolstrelki - ostrota + Math::PI )*ostrie + y2 + 100 ;
            f2x2 = Math::Cos(ugolstrelki - ostrota + Math::PI )*ostrie + x2 + 100 ;
только в с++ перепиши)

Автор: EnergoHokum 23.12.2007, 14:07
В где рисовать-то? В консоли псевдографикой или в оконном приложении? Если в окне, то можно средствами WinAPI (точнее, GDI+) отрисовывать и прямые, и дуги, и ломаные, кажись, даже кривые Безье можно рисовать.

Автор: specter50000 23.12.2007, 14:49
Цитата(jonie @  22.12.2007,  22:27 Найти цитируемый пост)
 float f1x2 , f1y2, f2x2, f2y2;
            float ugolstrelki = Math::Atan2( y2-y1 , x2-x1 );

Не совсем понятно, что эти переменные значат. Можно поподробнее?

Автор: zkv 23.12.2007, 15:17
specter50000, ты лучше на вопросы ответь сначала:
Цитата(EnergoHokum @  23.12.2007,  14:07 Найти цитируемый пост)
В где рисовать-то? В консоли псевдографикой или в оконном приложении?

а то разговор ни о чем получается  smile 

Автор: specter50000 23.12.2007, 15:26
Рисовать нужно в окне, используя CDC  smile 

Автор: zkv 23.12.2007, 15:29
Цитата(specter50000 @  23.12.2007,  15:26 Найти цитируемый пост)
Рисовать нужно в окне, используя CDC

MFC значит.
Цитата(specter50000 @  23.12.2007,  14:49 Найти цитируемый пост)
Не совсем понятно, что эти переменные значат.

очевидно - это координаты начала и конца стрелки.

Автор: specter50000 23.12.2007, 15:32
Цитата(zkv @  23.12.2007,  15:29 Найти цитируемый пост)
очевидно - это координаты начала и конца стрелки. 

Это про

float f1x2 , f1y2, f2x2, f2y2 ,

я правильно понимаю?

А х1, у1, х2 и у2 зачем нужны, не могли бы пояснить?  smile 




Автор: jonie 23.12.2007, 15:45
Цитата

А х1, у1, х2 и у2 зачем нужны, не могли бы пояснить?  
координаты начала и конца линии где надо рисовать стрелку
Цитата

float f1x2 , f1y2, f2x2, f2y2 ,
координаты, вычисляемые, стрелки - полигон читай.

Автор: zkv 23.12.2007, 15:54
Цитата(specter50000 @  23.12.2007,  15:32 Найти цитируемый пост)
Это про

float f1x2 , f1y2, f2x2, f2y2 ,

я правильно понимаю?

А х1, у1, х2 и у2 зачем нужны, не могли бы пояснить?

прошу прощения, невнимательно посмотрел в код.

Автор: jonie 23.12.2007, 16:10
Код

const double M_PI = 3.14;
double Gug = 150;
double Lstr = 25;
int RetGrad(int w,int h)
{
    float fw=w,fh=h,fg=sqrt(fw*fw+fh*fh),fs,fc;
    if(fg==0) return 0;
    fs=fh/fg;fc=fw/fg;
    if(fs>=0) return 180.0*acos(fc)/3.14;
    else return 360.0-180.0*acos(fc)/3.14;
}


void DrawVector(HDC hdc, int bx, int by, int ex, int ey)
{
    int ug;
    POINT poly[3];

    MoveToEx(hdc,bx,by,0);
    LineTo(hdc,ex,ey);
    ug=RetGrad(ex-bx,ey-by);
    ug=ug-Gug;
    poly[0].x=ex;
    poly[0].y=ey;
    poly[1].x=ex+Lstr*cos(ug*M_PI/180);
    poly[1].y=ey+Lstr*sin(ug*M_PI/180);
    ug=ug+2*Gug;
    poly[2].x=ex+Lstr*cos(ug*M_PI/180);
    poly[2].y=ey+Lstr*sin(ug*M_PI/180);
    SetPolyFillMode(hdc,WINDING);
    Polygon(hdc,poly,3);
}


Автор: specter50000 23.12.2007, 17:01
Кажется, разобрался... Спасибо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)